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" 。 编译器代表您提供常量字符串的内存:您不需要分配此内存。

在使用absprintf ,你需要使用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指针来处理在数组上运行的函数。