我试图将文字传递给函数,将其分配给struct并在以后使用。是我必须malloc()
和strcpy()
,还是可以保存char*
供以后使用(它是否被静态分配)?
下面的简约示例代码:
struct data {
char *string;
...;
}
struct data *create_data(char *input_string, ...) {
struct data *result = malloc(sizeof(struct data));
result->string = input_string;
return result;
}
struct data *string = create_data("Hey", ...);
printf("%s", data->string);
或
struct data *create_data(char *input_string, ...) {
struct data *result = malloc(sizeof(struct data));
result->string = malloc(sizeof(input_string));
strcpy(result->string, input_string);
return result;
}
struct data *string = create_data("Hey",...);
printf("%s", data->string);
我可以期望第一个起作用,这样内存中的数据不会被覆盖吗,或者假设这样做是不安全的?
答案 0 :(得分:7)
字符串文字具有静态存储持续时间。对于这样的对象,C11 6.2.4p3表示:
生命周期是程序的整个执行过程,并且在程序启动之前,其存储值仅初始化一次。
生命周期C11 6.2.4p2
- 对象的生存期是程序执行的一部分,在此期间保证为其保留存储空间。一个对象存在,具有恒定的地址33),并在其整个生命周期中保留其最后存储的值。34)如果在其生命周期之外引用了一个对象,则该行为是不确定的。当指针所指向的对象(或刚过去的对象)达到其生命周期的终点时,指针的值将变得不确定。
即您可以安全地存储指向字符串文字的指针,以用于程序执行的其余部分。
但是,尝试free
字符串文字将具有未定义的行为,因此,如果您有时使用字符串文字,有时使用malloc
化的字符串,则需要跟踪它或使用您在所有情况下的第二选择。
并且由于字符串文字是不可变的,因此,如果要修改字符串,则必须复制它们。
最后,malloc(sizeof(input_string))
是错误的,它必须 malloc(strlen(input_string) + 1)
。对于复制字符串,POSIX具有strdup
function。