2017-10-16 38 views
1

我有一个解析文本文件并将其存储在指针数组中的程序。我只有一个问题。我试图在一个char **对象中存储一个字符串数组,但是每当我给char **赋值时,就会发生seg故障。将值赋给char ** seg错误

#include "database.h" 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

char **get_values(int recipe_num, char *file) { 
    int placehold_num=recipe_num; 
    char *text=parse_recipes(file); 
    int num_recipes=count_recipes(file); 
    char **array_strings; 
    int index=-1; 
    for (int i=0;*(text+i)!='\0';i++) { 
     if (*(text+i)=='R' && *(text+i+1)=='e' && *(text+i+6)==':' && (text+i+7)==' ') { 
      i+=13; 
      index++; 
      for (int j=0;*(text+i+j-1)!='\n';j++) { 
       printf("%c",*(text+i+j)); 
       *(*(array_strings+index)+j)=*(text+i+j); 
      } 
     } 

    } 

} 

这打印出下一行,我从*(text+i+j)想要的字符,但赛格故障。我非常确定这不是一个被调用的函数的问题,我认为它必须是我提供的方式array_strings。任何帮助是极大的赞赏。

+1

请发表[mcve]。你的调试器告诉你什么? – melpomene

+1

你从来没有为'array_strings'指定任何内存。 – Barmar

+1

'text + i + j'不是访问二维数组元素的正确方法。它应该是'text +我* row_size + j' – Barmar

回答

1

的问题是在

*(*(array_strings+index)+j)=*(text+i+j); 

您创建一个变量

char** array_strings; 

它现在指向一些垃圾,你可以通过调用

print("%p\n", array_strings); 

看到当前地址我强烈建议通过NULL初始化array_strings,因为一旦你可以rec将一个指向内存的指针指向内存,然后将其写入某个地方,在那里可以存储其他数据,然后您将销毁这两个数据。如果是NULL,您将永远收到segfault。所以,此时你正试图将一个值*(text+i+j)分配给内存中的一个随机位置。

要做到,你想要什么,你必须

char** array_strings = (char**)malloc(n * sizeof(char*)); 

其中n是你需要串的量,然后在循环做

array_strings[some_your_index] = text+i+j; 

array_strings[some_your_index]现在char*,为text+i+j是。

+0

请参阅:[**我施放了malloc的结果吗?**](http://stackoverflow.com/q/605845/995714)'char ** array_strings = malloc(sizeof * array_strings);'就够了。然后您需要分配每个字符串,例如'array_strings [i] = malloc(strlen(str)+ 1);' –

+0

谢谢你的那篇文章,真的很有意思。我可以使用我的'char *'指针来指向字符串,例如,在旧的大字符串中用'\ 0'分隔。另外,对于我来说,阅读'sizeof * array_strings'比'sizeof char *'更困难,我认为这样写并不是一个问题 – Alex