空字符串是否应该等于 C 中的空终止符?

Should a null character string be equal to a null-terminator in C?

用空字符初始化字符数组和用空终止符初始化字符数组有区别吗?这两个例子:

char * result = ""
char * result = '[=10=]';

第一个报错,但另一个还可以。

函数原型:

char * form(int n, ...);

密码是:

char * result = "";
char *next;
char val_int[12];
int i;
va_list args;
va_start(args, n);

for (i = 0; i < n; i++)
{
    int len = result ? strlen(result) : 0;
    sprintf(val_int, "%d", va_arg(args,int));
    next = val_int;
    char *tmp = (char *)malloc(len + strlen(next) + 1);

    strcpy(tmp, result ? result : "");
    strcat(tmp, next);

    free(result);
    result = tmp;
}
va_end(args);
return result;

主要功能:

  char *s;
  s = form(3,123,456,789);
  printf("%s", s);
  free(s);
  return 0;

第一次申报

char * result = "";

声明一个指向包含一个字符的字符串文字的指针:终止零 '[=22=]'

这个声明

char * result = '[=11=]';

用空指针常量初始化指针,等价于

char * result = NULL;

这是一个演示程序

#include <stdio.h>

int main(void) 
{
    char *s1 = "";
    char *s2 = '[=13=]';

    printf( "s1 == NULL is %s\n", s1 == NULL ? "true" : "false" );
    printf( "s2 == NULL is %s\n", s2 == NULL ? "true" : "false" );

    return 0;
}

它的输出是

s1 == NULL is false
s2 == NULL is true

至于你说的错误那么原因就是这个说法

free(result);

您不能释放字符串文字占用的内存。您可以释放动态分配的内存。

当使用了由字符字面量'[=22=]'初始化的指针时,这样的指针就是空指针,你可以调用free作为空指针。

也就是说,如果你有一个像

这样初始化的指针
char * result = NULL;

写的一样

char * result = '[=11=]';

那你可以打电话给

free( result );

这样的调用不会执行任何操作。

但是如果你会写

free( "" );

尝试释放具有静态存储持续时间的字符串文字,您将得到未定义的行为。

还有这个电话

free( "" );

相当于下面的代码片段

char * result = "";
free( result );

问题似乎是您试图释放未分配给 malloc 的内存。

在 C 中,所有文字字符串实际上(由编译器)存储为不可修改的字符数组。

当你有

char * result = "";

编译器将为空字符串创建这样一个数组。它将包含一个元素,即字符串空终止符。初始化将使 result 指向该数组的第一个元素。

和任何其他数组一样,您不能 free 它。

char * result = "";
free(result);

基本相同
char array[] = "";
char * result = array;
free(result);

这毫无意义。

这适用于

char * result = '[=13=]';

是因为(如解释的那样)将 result 初始化为空指针,并且将空指针传递给 free 是有效的(这是一个空操作)。