C语言 为什么字符 * 无法接收正确的值



有人可以帮我解释以下代码吗?

为什么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: %sn", s); // Works fine just as expected.
}
int main()
{
    char *s;
    bar(s);
    printf("%sn", s); // Output some undefined content like `H?}?H??`, other than `Hello Heap.`
}

代码已修复

#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: %sn", *s); // Works fine just as expected.
}
int main()
{
    char *s;
    bar(&s);
    printf("%sn", 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: %sn", s); // Works fine just as expected.
}

在此函数中,sfoo()函数获取指针(指向已分配内存的指针)。 但是您没有将s指针地址传达给函数 更高的 leve ( main )。 为此,您必须在函数末尾返回s的地址,或者您可以使用输入参数传递指针地址的地址cha ** s

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

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

现在考虑主要,

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

您应该尝试以下操作:

像这样主呼,bar(&s)

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

您必须在

内存分配后立即使用 StrCpy 或 strncpy。

您不能说"s"等于"

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

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

您在分配过程中缺少某些内容;)

相关内容

  • 没有找到相关文章