0

誰かが次のコードを説明するのを手伝ってくれますか:

char *sに割り当てられたメモリのポイント位置を が受け取らないのはなぜfoo()ですか?

#include <stdio.h>
#include <stdlib.h>

char *foo()
{
    char *s = (char *)malloc(20);
    s = "Hello Heap.";
    return s;
}

void bar(char *s)
{
    s = foo();
    printf("bar: %s\n", s); // Works fine just as expected.
}

int main()
{
    char *s;
    bar(s);
    printf("%s\n", s); // Output some undefined content like `H?}?H??`, other than `Hello Heap.`
}
4

3 に答える 3

5

コードが修正されました

#include <stdio.h>
#include <stdlib.h>

char *foo()
{
    char *s = (char *)malloc(20);
    strcpy(s,"Hello Heap.");
    return s;
}

void bar(char **s)
{
    *s = foo();
    printf("bar: %s\n", *s); // Works fine just as expected.
}

int main()
{
    char *s;
    bar(&s);
    printf("%s\n", s); // Output some undefined content like `H?}?H??`, other than `Hello Heap.`
}

説明:

1) コードには以下が含まれます。

char *s = (char *)malloc(20);
 s = "Hello Heap.";

これは良くない。このように"Hello Heap."して、割り当てられたメモリにメッセージをコピーしていません。実際には、割り当てられたメモリへの s ポインターを指し、次に定数文字列アドレスへのポインターを指しています。

2)コードには含まれています

void bar(char *s)
{
    s = foo();
    printf("bar: %s\n", s); // Works fine just as expected.
}

この関数sでは、関数からポインター (割り当てられたメモリへのポインター) を取得していfoo()ます。sしかし、ポインタアドレスを関数の上位レベルに伝えていません( main)。関数の最後にアドレスを返す必要がsあるか、入力パラメーターを使用してポインターのアドレスのアドレスを介して渡すことができますcha ** s

于 2012-11-23T13:34:55.203 に答える
1
char *foo()
{
    char *s = (char *)malloc(20);
    s = "Hello Heap.";
    return s;
}

ここsでfooはfooに対してローカルであり、割り当て後、実際には文字列リテラルであり、ヒープ上にない「Helloheap」を割り当てています(注意してください)。しかし、とにかくs = "Hello heap"は正しく、返されるsはキャプチャされbars印刷していることを示します。

今メインについて考えて、

bar(s)大丈夫ですがprintfsあなたが使用しているのはローカルからメインまでなので、他のものを印刷します、それsはあなたがアクセスしているものではありませんbar

代わりにこれを試してください:

このようにメインを呼び出す、bar(&s)

の署名を変更しますbar(char **s)

于 2012-11-23T13:49:45.220 に答える
0

メモリ割り当ての直後に StrCpy または strncpy を使用する必要があります。

「s」が「」に等しいとは言えません

これは C では正しくありません。これは汚い例ですが、次のことを試してください。

    s[0] = 'h';
s[1] = 'e';
s[2] = 'l';
s[3] = '\0';

割り当てプロセスに何かが欠けています;)

于 2012-11-23T13:37:01.093 に答える