结束后可以保存(和使用)传递给函数的char *文字吗?

时间:2019-05-04 19:39:17

标签: c

我试图将文字传递给函数,将其分配给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);

我可以期望第一个起作用,这样内存中的数据不会被覆盖吗,或者假设这样做是不安全的?

1 个答案:

答案 0 :(得分:7)

字符串文字具有静态存储持续时间。对于这样的对象,C11 6.2.4p3表示:

  

生命周期是程序的整个执行过程,并且在程序启动之前,其存储值仅初始化一次。

生命周期C11 6.2.4p2

  
      
  1. 对象的生存期是程序执行的一部分,在此期间保证为其保留存储空间。一个对象存在,具有恒定的地址33),并在其整个生命周期中保留其最后存储的值。34)如果在其生命周期之外引用了一个对象,则该行为是不确定的。当指针所指向的对象(或刚过去的对象)达到其生命周期的终点时,指针的值将变得不确定。
  2.   

即您可以安全地存储指向字符串文字的指针,以用于程序执行的其余部分。


但是,尝试free字符串文字将具有未定义的行为,因此,如果您有时使用字符串文字,有时使用malloc化的字符串,则需要跟踪它或使用您在所有情况下的第二选择。

并且由于字符串文字是不可变的,因此,如果要修改字符串,则必须复制它们。


最后,malloc(sizeof(input_string))是错误的,它必须 malloc(strlen(input_string) + 1)。对于复制字符串,POSIX具有strdup function