我正在编写一个相当简单的程序来逐行读取文件并将其存储到一个行数组中,我的程序编译得很好但每次运行它都会崩溃。 这是我的代码:
@FindBys(class="li") private <List>WebElement searchBoxes;
我尝试复制数组的行给了我麻烦,所以我的问题是,如果我是的话,如何将我的字符数组#include <stdio.h>
#include <string.h>
#define LINESIZE 512
typedef struct {
char **data;
size_t nused;
} lines_t;
lines_t readlines(FILE *fp);
int main(int argc,char* argv[]) {
FILE *fp;
(void)argc;
if((fp = fopen(argv[1],"r+")) == 0) {
perror("fopen");
}
readlines(fp);
return 0;
}
lines_t readlines(FILE *fp) {
lines_t line_data;
char line[LINESIZE];
char temp[20];
int num_lines = 0;
(*line_data.data) = (char *)malloc(LINESIZE);
while(fgets(line,LINESIZE,fp)) {
sscanf(line,"%s\n",temp);
strcpy(line_data.data[num_lines], temp); /* Program crashes here */
num_lines++;
}
return line_data;
}
复制到temp
char **data
内没做对吗?
答案 0 :(得分:3)
您在此处取消引用无效指针:
(*line_data.data) = (char *)malloc(15);
line_data.data
是char **
。你试图尊重它,但它还没有设置任何有意义的价值。在为line_data.data
分配内存之前,需要为*line_data.data
分配内存。
(char *)malloc(15)
也特别可疑。 15
来自哪里,你实际为内存分配的是什么?投射malloc
的结果通常被视为不良做法,在您的情况下,这是正确的,因为malloc
已在stdlib.h
中声明,并且您不包括该标题。如果您想要分配足够的空间来容纳15 char *
,那么请使用malloc(15 * sizeof(char *))
或malloc(15 * sizeof(*line_data.data))
(这里使用*line_data.data
是安全的,即使它不是sizeof
。 t指向任何东西,因为MyProject\CoreBundle
不评估其操作数。)
答案 1 :(得分:0)
您可以在malloc line_data.data
之前尝试strcpy
。
lines_t readlines(FILE *fp) {
lines_t line_data;
line_data.data = malloc(LINESIZE);
*line_data.data = malloc(LINESIZE);
return line_data;
}
答案 2 :(得分:0)
首先需要分配内存 您需要为字符串数组和字符串数组分配两者。在调用malloc时,你需要有一个上限。
line_data = malloc(10* sizeof(char*)); // for example here the upper limit is 10
while(fgets(line,LINESIZE,fp)) {
sscanf(line,"%s\n",temp);
line_data.data[num_lines] = malloc(sizeof(char) * (strlen(temp)+1));
strcpy(line_data.data[num_lines], temp); /* Program crashes here */
num_lines++;
}