Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么char*无法接收正确的值?_C_Malloc_Heap - Fatal编程技术网

为什么char*无法接收正确的值?

为什么char*无法接收正确的值?,c,malloc,heap,C,Malloc,Heap,谁能帮我解释一下以下代码: 为什么char*s没有收到在foo()上分配的内存点位置 #包括 #包括 char*foo() { char*s=(char*)malloc(20); s=“你好,希普。”; 返回s; } 空栏(字符*s) { s=foo(); printf(“条:%s\n”,s);//正常工作。 } int main() { char*s; 酒吧;; printf(“%s\n”,s);//输出一些未定义的内容,如'H?}?H???,而不是'Hello Heap'` } 代码已修复

谁能帮我解释一下以下代码:

为什么
char*s
没有收到在
foo()上分配的内存点位置

#包括
#包括
char*foo()
{
char*s=(char*)malloc(20);
s=“你好,希普。”;
返回s;
}
空栏(字符*s)
{
s=foo();
printf(“条:%s\n”,s);//正常工作。
}
int main()
{
char*s;
酒吧;;
printf(“%s\n”,s);//输出一些未定义的内容,如'H?}?H???,而不是'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: %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.`
}
这不好。这样,您就不会将
“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
通过指针地址传递代码

#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.`
}
这不好。这样,您就不会将
“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

传递指针的地址,您必须在内存分配后立即使用StrCpy或strncpy

不允许您说“s”等于“”

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

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

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

必须在内存分配之后立即使用StrCpy或strncpy

不允许您说“s”等于“”

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

    s[0] = 'h';
s[1] = 'e';
s[2] = 'l';
s[3] = '\0';
您在分配过程中遗漏了一些内容;)

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

现在想想主要的

bar
很好,但是在
printf
中,您使用的
s
是本地的,所以打印其他内容时,不是在
bar中访问的
s

您应该尝试以下方法:

像这样调用main,
bar&s)

并更改as
bar(char**s)

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

现在想想主要的

bar
很好,但是在
printf
中,您使用的
s
是本地的,所以打印其他内容时,不是在
bar中访问的
s

您应该尝试以下方法:

像这样调用main,
bar&s)


并更改as
bar(char**s)

的签名。我没有投反对票,但可能是因为你发布了一个只有代码的答案。请解释为什么指向char指针的指针是必需的。我没有投反对票,但可能是因为你发布了一个只有代码的答案。请解释为什么指向char指针的指针是必需的