将格式化输出发送到C中的字符数组元素

时间:2016-02-06 13:53:36

标签: c arrays pointers printf

我有一个字符串数组。我需要用一些格式化数据初始化每个数组元素,即每个元素应该保持一个常量字符串“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;
}

2 个答案:

答案 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,因为它不允许发生缓冲区溢出。在这段代码中,每个元素都被初始化 - 你不能只是写入指针。要删除此数组的限制,我们可以使用mallocrealloc