我正在尝试使用一个函数来创建2D字符数组,将所有字符设置为字符x,并打印前10行以测试操作是否正确。
我的代码使用以下代码进行编译:gcc -std = c89 -pedantic code.c 但是,当我尝试使用./a.out运行代码时,出现了分段错误。
我已将问题隔离在尝试打印数组时,因为注释掉行printf("%c", a[i][j]);
时没有分段错误。
#define rows 100
#define columns 3
char** makeArr(int rows, int columns)
{
int temp,i,j;
char** a = (char**)malloc(rows*sizeof(char*));
for(temp = 0; temp < rows; temp++)
{
a[temp]=(char*)malloc(columns*sizeof(char));
}
memset(a, 'x', rows*columns*sizeof(a[0][0]));
for(i = 0; i < 10; i++)
{
for(j = 0; j < columns; j++)
{
printf("%c", a[i][j]);
}
printf("\n");
}
return a;
}
对于此问题的任何帮助将不胜感激,如果需要更多上下文,请告诉我。
答案 0 :(得分:2)
您可以将数组分配为连续块:
char (*arr)[COLUMNS] = malloc(sizeof *arr * ROWS);
memset(arr, 'x', sizeof *arr * ROWS);
memset
调用超出了分配的数组a
的范围:
memset(a, 'x', rows*columns*sizeof(a[0][0]));
该数组由char*
指针组成,并具有rows
元素。由于您要分别分配子数组,因此需要对每个memset
指针进行单独的malloc
调用。假设字符串的长度固定,那么将存储分配为一个连续的块会更简单。
答案 1 :(得分:1)
最简单的解决方案是在与memset
行相同的循环中执行malloc
:
for(temp = 0; temp < rows; temp++) {
a[temp] = malloc(columns*sizeof(char));
memset(a[temp], 'x', columns);
}
请注意,我没有将columns * sizeof(a[0][0])
乘以。 sizeof(a[0][0])
是char
的大小,以字节为单位,因此通常为1。如果您要进行columns * sizeof(a[0][0])
,它仍然可以在大多数系统上使用,但是在实际使用中,实际上并没有因为sizeof(char)
几乎普遍为1,所以需要它。