C中的char指针初始化
关于字符指针以及它们是如何工作的我不太清楚。
该程序构建,但运行时崩溃。
char *ab = NULL; //ab = "abc123"; // works fine sprintf(ab, "abc%d", 123); // this line seems to crash the program
当sprintf接受(char * str)作为第一个参数时,我不明白这是怎么回事。
有人可以向我解释一下吗?
你没有分配任何内存用于ab
。
第一个赋值是有效的,因为你要赋予ab
一个字符串常量: "abc123"
。 编译器代表您提供常量字符串的内存:您不需要分配此内存。
在使用ab
与sprintf
,你需要使用malloc
分配一些内存,并将该空间分配给ab
:
ab = malloc(sizeof(char) * (NUM_CHARS + 1));
那么只要你使用malloc
创造了足够的空间,你的sprintf
就会工作。 注意: + 1
表示空终止符 。
或者,您可以通过将其声明为数组来为ab
创建一些内存:
char ab[NUM_CHARS + 1];
如果不以某种方式为ab
分配内存, sprintf
调用将尝试写入NULL
,这是未定义的行为; 这是你崩溃的原因。
您需要为数据分配内存。 确实sprintf
需要char*
,但它不会为你分配内存。
第一行工作正常,因为编译器会自动为编译时定义的常量字符表分配数据。
与Java
或其他更高级语言不同,许多C
库的字符串函数不是简单地设置字符串引用,而是在一个预先分配的内存块(称为字符数组)上运行。
你的第一行是说ab
指向一个不存在的内存位置。
如果代替char *ab = NULL;
你会有更多的运气char *ab = NULL;
你这样做了:
char ab[12];
要么:
char *ab = (char*)malloc(12);
你可以这样做
char ab[10]; //allocate memory sprintf(ab, "abc%d", 123);
“ab”为null并且sprintf正在尝试写入它,您必须先分配它。
char ab[20]; sprintf(ab, "abc%d", 123); //
要么
char * ab = malloc(20); // new, whatever sprintf(ab, "abc%d", 123); //
这里有几点需要考虑。 您的原始示例如下:
char *ab = NULL; //ab = "abc123"; // works fine sprintf(ab, "abc%d", 123); // this line seems to crash the program
char *ab = NULL;
是一个指向字符的指针,并初始化为NULL;
我不认为ab = "abc123";
工作正常,除非看起来像char *ab = "abc123";
。 那是因为您将char *ab
初始化为只读字符串。 初始化可能发生在编译时。
你的sprintf(ab, "abc%d", 123);
行失败,因为您没有提前为char *ab
指针初始化任何内存。 换句话说,你没有做类似的事情:
ab = malloc((sizeof(char) * 3) + 1); /* + 1 allows for null string terminator. */
您可以通过两种方式解决问题。 如上所示分配动态内存,或者可以使字符串成为固定长度的数组,如char ab[25] = {0};
。 通常,我创建一个长度为1024,256或某个数字的数组,通常会覆盖我的大部分字符串长度。 然后我使用char指针来处理在数组上运行的函数。