编辑:问题回答,我的第一个for循环中有一个拼写错误。非常感谢大家抓住这一点 我正在为uni工作一个C项目,我遇到了一个我无法弄清楚的问题。在程序的一个部分中,我必须将几个符号串读入结构中的2D字符数组(也称为“标记”)。这是我的函数中的代码:
stamp_t * read_stamp_type1(FILE * fptr)
{
//variable declaration
int r = 0, c = 0;
//creating a struct stamp_t and mallocing memory
stamp_t *newstamp1;
newstamp1 = malloc(sizeof(stamp_t));
//reading in values for the rows and columns of the "stamp" to be read in
fscanf(fptr, "%d %d\n", &r, &c);
//storing these values
newstamp1->num_rows = r;
newstamp1->num_cols = c;
//creating memory for newstamp1's grid
newstamp1->grid = malloc(sizeof(char *) * (r));
for(int i=0; i < c; i++)
newstamp1->grid[i] = malloc(sizeof(char) * (c+1));
//string to temporarily store input
char rowvalues[c+1];
//Note: Everything works up until this point
//the below lines crash the program every time
for(int i = 0; i < r; i++)
{
fscanf(fptr, "%s", rowvalues);
for (int j=0; j < c; j++)
strcpy(newstamp1->grid[i], rowvalues);
}
free(rowvalues);
return(newstamp1);
}
出于某种原因,当我尝试从文本文件中fscanf字符串时,它会使程序崩溃(或者至少是我认为原因是......)。 作为参考,这是结构声明:
// A structure for holding a stamp
typedef struct
{
// The size of the contents of this stamp.
int num_rows;
int num_cols;
// A 2D array of characters for a stamp.
char **grid;
} stamp_t;
以下是该计划的输入:
3 4
.#.@
#.#.
.#.@
任何建议都会非常感激,我似乎无法找到代码的任何问题。我已经尝试手动为rowvalues数组中的每个值赋值,这工作正常(rowvalues [0] ='c';工作正常)。我需要将3行符号读入newstamp1.grid,这是一个2D数组。我运行了一个调试器,它说它试图写入不允许的内存(“访问冲突写入位置”)。我通过电子邮件发送了我的教授,但他过去一周没有上课,而且他没有回复电子邮件......
非常感谢提前。
答案 0 :(得分:3)
对于初学者来说,这个循环中存在拼写错误
newstamp1->grid = malloc(sizeof(char *) * (r));
for(int i=0; i < c; i++)
^^^^^^
newstamp1->grid[i] = malloc(sizeof(char) * (c+1));
必须有
for(int i=0; i < r; i++)
^^^^^^
此循环
for (int j=0; j < c; j++)
strcpy(newstamp1->grid[i], rowvalues);
没有意义。看来你的意思就是
strcpy(newstamp1->grid[i], rowvalues);
如果文件中的每一行都包含c
个字符串,也许您必须分配一个3D字符数组(即字符串的二维数组)。
这句话
free(rowvalues);
错了。变量rowvalues
具有自动存储持续时间。所以你可能不会为它调用函数free
。
答案 1 :(得分:2)
这部分代码是无稽之谈:
newstamp1->grid = malloc(sizeof(char *) * (r));
for(int i=0; i < c; i++)
newstamp1->grid[i] = malloc(sizeof(char) * (c+1));
您分配了r
项,然后for
重复c
次。这应该是相同的,r
或c
。我打赌i < r
是正确的条件。
另外,正如莫斯科的Vlad指出的那样,代码中还有一个错误:最终free
不应该存在,因为它不是malloc
ated。并且for-j
行也可以省略。 (但它不应该产生任何错误,它只是不必要地重复相同的代码。)