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;
}

这里sfoo 对 foo 是本地的,在分配之后,您实际上是在分配“Hello heap”,它是字符串文字,而不是在堆上(请注意)。但无论如何 s="Hello heap" 是正确的,并且返回的 s 被捕获bar并且s您正在打印。

现在想想主要的,

bar(s)很好,但在printfs使用的是本地到 main 所以打印其他东西,这不是s你在bar

你应该试试这个:

像这样调用主要,bar(&s)

并更改 as 的签名bar(char **s)

于 2012-11-23T13:49:45.220 回答
0

您必须在内存分配后使用 StrCpy 或 strncpy。

你不能说 's' 等于 ""

这在 C 中不是 tru。这是一个肮脏的例子,但尝试这样做:

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

您在分配过程中遗漏了一些东西;)

于 2012-11-23T13:37:01.093 回答