在结构中分配未初始化的字符指针或字符指针可以吗? struct测试{ char*s; }; 试验; test.s=“嘿”;

在结构中分配未初始化的字符指针或字符指针可以吗? struct测试{ char*s; }; 试验; test.s=“嘿”;,c,pointers,struct,char,C,Pointers,Struct,Char,或 char*s; s=“嘿”; 所以我不需要编辑字符串,或者类似的东西。我只是想知道我上面的代码是允许的,还是可以安全使用 如果不应该使用,为什么 或者,如果有更好的方法,我应该这样做?这是允许的。您甚至不会从-Wall或-Wextra收到警告,尽管您会使用-Wwrite strings 只要您不更改s指向的数组中的任何元素(例如*s或s[0]),或尝试释放s,就安全了 如果您处理大量的测试,并且有些字符串是只读的,有些则不是只读的,那么您可能会遇到问题。例如,当测试被销毁时,您如何知道是否

char*s;
s=“嘿”;
所以我不需要编辑字符串,或者类似的东西。我只是想知道我上面的代码是允许的,还是可以安全使用

如果不应该使用,为什么


或者,如果有更好的方法,我应该这样做?

这是允许的。您甚至不会从
-Wall
-Wextra
收到警告,尽管您会使用
-Wwrite strings

只要您不更改
s
指向的数组中的任何元素(例如
*s
s[0]
),或尝试释放
s
,就安全了


如果您处理大量的
测试
,并且有些字符串是只读的,有些则不是只读的,那么您可能会遇到问题。例如,当
测试被销毁时,您如何知道是否应该释放字符串

如果没有任何字符串将被编辑或释放,则如果您尝试执行不应执行的操作,则可以使用以下命令获得至少一条警告:

struct测试{
常量字符*s;
};
在另一个方向上,您可以制作可编辑和/或释放的字符串副本

test.s=strdup(“嘿”);

“例如,当测试被销毁时,您如何知道是否应该释放字符串?”那么,您基本上是说,如果malloc,在释放结构之前,我必须先确定要释放哪个字符串?是的。或者当它超出范围时,如果您进行了
测试原因
test.s=“嘿”;免费(测试s)
不正确,在其他情况下,不调用
free(test.s)
可能会导致内存泄漏。如果你总是处理其中一个,那么就没有问题了。但是如果你有一个混音,你可能会有问题
char*s=buff也很好,还是我应该做strdup?(但是,我不使用strdup)此版本可以写入,但不能释放。这取决于你需要什么。您应该经常问自己的一个问题是“谁拥有这个?”所有者是代码或数据结构,负责在var/数组仍在使用时保持分配,反之,它还负责在不再使用时释放var/数组。(所有权可以转移。)如果
test
是所有者,则需要使用
strdup
(或者需要一个标志指示是否应释放它)。否则,其他任何一个都可以接受。根据编译器设置,您可能会收到一条警告(有些人喜欢启用使用非常量
char*
指向字符串文本的警告)在C中,所有文本字符串都是以空结尾的(只读)字符数组。这些数组的生命周期与完整程序的生命周期相同。赋值使指针指向数组中的第一个字符。只读位是建议对此类变量使用
const char*
的原因。