为什么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)
并更改asbar(char**s)
这里,foo中的s
是foo本地的,在分配之后,您实际上是在分配“Hello heap”,它是字符串文本,不在堆上(注意)。
但是无论如何,s=“Hello heap”是正确的,返回的s被捕获在栏中,并且您正在打印的s
现在想想主要的
bar
很好,但是在printf
中,您使用的s
是本地的,所以打印其他内容时,不是在bar中访问的s
您应该尝试以下方法:
像这样调用main,bar&s)
并更改asbar(char**s)
的签名。我没有投反对票,但可能是因为你发布了一个只有代码的答案。请解释为什么指向char指针的指针是必需的。我没有投反对票,但可能是因为你发布了一个只有代码的答案。请解释为什么指向char指针的指针是必需的