为什么char *无法获得正确的价值?

时间:2012-11-23 13:32:29

标签: c malloc heap

有人可以帮我解释下面的代码:

为什么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.`
}

3 个答案:

答案 0 :(得分: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

通过指针地址传递

答案 1 :(得分:1)

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

foo中的s在foo是本地的,在分配之后你实际上是在分配“Hello堆”,它是字符串文字而不是堆(请记住)。 但无论如何s =“Hello堆”是正确的,并且在bar中捕获了返回的s并且正在打印s

现在想想main,

bar(s)很好,但在printf你使用的s是本地的主要内容,因此打印其他内容,而不是s您正在访问的内容bar

你应该试试这个:

像这样主调,bar(&s)

并将签名更改为bar(char **s)

答案 2 :(得分:0)

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

你不能说's'等于“”

这不是C. 这是一个肮脏的例子,但试着这样做:

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

您在分配过程中遗漏了一些内容;)