C中的char指针初始化

时间:2012-06-15 17:24:32

标签: c string pointers char

我对字符指针及其工作方式不太清楚。

程序构建,但在运行时崩溃。

 char *ab = NULL;
 //ab = "abc123"; // works fine
 sprintf(ab, "abc%d", 123); // this line seems to crash the program

当sprintf将(char * str)作为第一个参数时,我不明白这是怎么回事。

有人可以向我解释一下吗?

6 个答案:

答案 0 :(得分:15)

您没有为ab分配任何内存。

第一个作业有效,因为您要为ab分配一个字符串常量:"abc123"。编译器代表您提供常量字符串的内存:您不需要分配此内存。

ab之前使用{例}}之前sprintf,您需要使用malloc分配一些内存,并将该空间分配给ab

ab = malloc(sizeof(char) * (NUM_CHARS + 1));

然后,只要您使用sprintf留出足够的空间,malloc就可以正常工作。注意:+ 1适用于null terminator

或者,您可以通过将其声明为数组来为ab创建一些内存:

char ab[NUM_CHARS + 1];

如果没有为ab以某种方式分配内存,sprintf调用将尝试写入NULL,这是未定义的行为;这是你崩溃的原因。

答案 1 :(得分:2)

您需要为数据分配内存。确实sprintf需要char*,但它不会为您分配内存。

第一行工作正常,因为编译器会自动为编译时定义的常量字符表分配数据。

答案 2 :(得分:1)

Java或其他更高级别的语言不同,许多C库的字符串函数不是简单地设置字符串引用,而是在一个预先分配的内存块上运行,称为字符阵列。

你的第一行是说ab指向一个不存在的内存位置。

如果你做了char *ab = NULL;而不是char ab[12]; ,你会有更多的运气:

char *ab = (char*)malloc(12);

或:

{{1}}

答案 3 :(得分:1)

你可以这样做

char ab[10];  //allocate memory
sprintf(ab, "abc%d", 123);

答案 4 :(得分:0)

“ab”为空,sprintf正在尝试写入它,你必须先分配它。

char ab[20];

sprintf(ab, "abc%d", 123); //

char * ab = malloc(20); // new, whatever

sprintf(ab, "abc%d", 123); //

答案 5 :(得分:0)

这里有几件事要考虑。您的原始示例如下:

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指针来处理在数组上运行的函数。