我有一个字符串数组。我需要用一些格式化数据初始化每个数组元素,即每个元素应该保持一个常量字符串“data”加上生成的数字。最后一个数组应该包含看起来像这样的元素,“data1”,“data2”,“data3”,......“dataN”。
我使用sprintf()
但是只要编译看到我的sprintf()
函数,程序就会崩溃。我做错了什么?
//import necessary headers
#include <stdio.h>
#include <stdlib.h>
//variable to hold server data
char *serverData[255];
//loop variable
int loop_index = 0;
//program entry
int main() {
//initialize the serverData array elements with string "data" and
//append number x to each element. i.e. x <= 255
//use a for loop for the initialization
for (; loop_index < sizeof(serverData) / sizeof(serverData[0]); loop_index++) {
sprintf((char*)serverData[loop_index], "%s%d", "data", loop_index); //program crashes when this line is reached
}
return 0;
}
答案 0 :(得分:3)
问题在于,您正在使用serverData[n]
,但未分配任何有效内存。 char *serverData[255];
是指针类型的全局数组,每个成员都被隐式初始化为空指针。
参考C11
,章节§6.7.9,
如果未初始化具有静态或线程存储持续时间的对象 明确地说:
- 如果它有指针类型,则将其初始化为空指针;
- 如果它具有算术类型,则将其初始化为(正或无符号)零;
- 如果是聚合,则根据这些规则初始化(递归)每个成员, 并且任何填充都初始化为零位;
- [.....]
空指针不是要访问的有效指针。
您需要先将内存分配给serverData[n]
,然后才能写入内存。在实际使用之前,您可以考虑使用malloc()
将内存分配给serverData[n]
。
答案 1 :(得分:0)
数组中的每个指针都是单位化的。试试这个
#define NSERVERS 255
#define MAXDATA 32
char serverdata[MAXDATA][NSERVERS];
for (i = 0; i < NSERVERS; ++i)
if (snprintf(serverdata[i], MAXDATA, "%s%d", "data", i) < 0)
fprintf(stderr, "snprintf returns <0\n");
建议{p> snprintf
超过sprintf
,因为它不允许发生缓冲区溢出。在这段代码中,每个元素都被初始化 - 你不能只是写入指针。要删除此数组的限制,我们可以使用malloc
和realloc
。