【问题标题】:Why char * cannot receive correct value?为什么 char * 不能接收正确的值?
【发布时间】:2012-11-23 13:32:28
【问题描述】:

谁能帮我解释一下下面的代码:

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

【问题讨论】:

    标签: c malloc heap-memory


    【解决方案1】:

    代码修复

    #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通过指针地址的地址传递

    【讨论】:

    • 我没有投反对票,但这可能是因为您发布了仅代码的答案。请解释为什么需要指向 char 指针的指针
    【解决方案2】:
    char *foo()
    {
        char *s = (char *)malloc(20);
        s = "Hello Heap.";
        return s;
    }
    

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

    现在想想主要的,

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

    你应该试试这个:

    像这样调用main,bar(&amp;s)

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

    【讨论】:

      【解决方案3】:

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

      你不能说's'等于""

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-29
        • 1970-01-01
        • 1970-01-01
        • 2020-07-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多