我试图在C中编写流编辑器,而且我很难处理字符串。在读取文件的行后,我想将它们本地存储在一个字符串数组中。但是,当我尝试将变量temp
存储到字符串数组StoredEdits
中时,出现segmentation fault (core dumped)
错误。此外,如果我取消注释char* temp2
变量并将其保存到我的数组中作为变通方法,则读入的最后一个值将存储为数组中的每个值。
我认为这与temp2是指针的事实有关。在每次迭代之后,我已经尝试了一百万个像malloc这样的变量和自由变量,但似乎没有任何效果。
非常感谢任何帮助。
#define MAX_SIZE 100
typedef char String[MAX_SIZE];
int main(int argc, char* argv[]){
char** StoredEdits;
int index, numOfEdits;
FILE *EditFile;
char* temp;
//char* temp2;
StoredEdits = (char**)malloc(MAX_INPUT_SIZE*sizeof(String));
/*Check to see that edit file is passed in.*/
if(argc < 2){
printf("ERROR: Edit File not given\n");
return(EXIT_FAILURE);
}
printf("%s\n",argv[1]);
if( (EditFile = fopen(argv[1],"r")) != NULL ){
printf("file opened\n");
numOfEdits = 0;
while(fgets(temp, MAX_STRING_SIZE, EditFile) != NULL){
printf("%d %s",numOfEdits,temp);
//temp2 = temp;
StoredEdits[numOfEdits++] = temp;
//StoredEdits[numOfEdits++] = temp;
printf("Stored successfully\n");
}
..........
printf("%d\n",numOfEdits);
for(index=0;index<numOfEdits;index++){
printf("%d %s\n",index, StoredEdits[index]);
}
答案 0 :(得分:4)
您需要初始化temp以指向有效存储。
temp = malloc(MAX_STRING_SIZE+1);
看起来你可能打算做这样的事情:
String temp;
使用你的宏。这将作为常规char数组更好。它的通用名称是 buffer 。
char buffer[MAX_STRING_SIZE+1];
然后,您应该存储在数组中,而不是temp
本身,而是存储包含内容副本的新字符串。 POSIX函数strdup
在这里应该有用。请注意,strdup
不是C标准的一部分,但它在大多数托管实现中都可用。从历史上看,它来自BSD分支。
StoredEdits[numOfEdits++] = strdup(temp);
让我稍微退一步说,如果你在1> 循环中为temp
分配新存储空间,那么你应该跳过strdup
因为,就像Jim Balter说,这会泄漏记忆。如果您在循环之外分配temp
,那么无论是静态分配(通过声明char []
)还是动态(使用malloc
),它都没什么区别。
顺便说一下,这条线不会给你带来太多的收获:
typedef char String[MAX_SIZE];
为什么,请参阅经典的Kernighan( K&amp; R 中的 K )论文Why Pascal is not my favorite Programming Language。
另请注意,上面的示例不检查malloc
返回的指针。 malloc
可能会失败。当malloc
失败时,它将返回NULL指针。如果您尝试通过此指针存储数据,Kaboom!
答案 1 :(得分:3)
由于指针语义,你的问题是正确的。您应该使用从temp。
复制字符串的内容char *cpy = malloc(1 + strlen(temp));
if (cpy)
strcpy(cpy, temp);
//else handle error
StoredEdits[numOfEdits++] = cpy;
答案 2 :(得分:0)
其他人回答了错误的原因。
但是从程序中,我看到你试图分配一个字符双数组。然后将从文件中读取的每一行存储到数组中。
StoredEdits = (char**)malloc(MAX_INPUT_SIZE*sizeof(String));
如果我的假设是正确的,那么你应该将数组传递给strcpy,如下所示。
strcpy(StoredEdits[numOfEdits],tmp);
当你有一个文件中每行的大小不一样时,最好将指针数组指向字符数组。