【发布时间】:2016-01-05 07:58:27
【问题描述】:
我正在尝试遍历我的链表并将每个节点字段组合成一个字符串,然后将该字符串添加到一个字符串数组中。
void listToArray(){
//create array of strings
char *list[numNodes];
int i = 0, n;
while(head != NULL){
// add string to array
printf("[%d] %s %s:%d\n ", i, head->fileName, head->ip, head->port);
n = sprintf(list[i], "[%d] %s %s:%d\n", i, head->fileName, head->ip, head->port);
head = head->next;
printf("%s\n", list[i]);
i++;
}
printf 语句工作正常,这表明不是节点的字段导致问题,而是当我执行我的 sprintf 语句将字符串复制到数组的索引中时。我得到一个分段错误。
【问题讨论】:
-
你必须为
list[i]分配内存 -
当您声明时,
char *list[numNodes];它为char指针数组分配空间,但它们尚未初始化。您需要分配它们(例如,对每个元素使用malloc:for ( i = 0; i < numNodes; i++ ) list[i] = malloc(stringSize);)。 -
你在哪里为每个非列表分配内存? list 被定义为一个指向字符数组的指针,但它不指向任何东西。你需要 malloc 什么的。我要做的是在堆栈上创建一个名为 temp 的字符数组,它足够大(可能 128 个字符?),例如
char temp[128];然后 sprintf 进入 temp 然后设置list[i] = strdup(temp); -
而不是
sprintf(),使用asprintf(),它将自动分配足够大的内存来保存包含空字节终止符的结果字符串。然而,这是一个 GNU 扩展,在 *BSD 中也可用,但在 POSIX 中不可用。 -
我遇到了分段错误。 -- 祝你好运!更糟糕的事情可能会发生(例如,似乎以您认为正确的方式“工作”,但后来却以致命的方式失败)。