空字符串是否应该等于 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
是有效的(这是一个空操作)。
用空字符初始化字符数组和用空终止符初始化字符数组有区别吗?这两个例子:
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
是有效的(这是一个空操作)。