gpt4 book ai didi

c - 尝试用 C 语言创建矩阵时出现段错误

转载 作者:行者123 更新时间:2023-11-30 15:30:36 26 4
gpt4 key购买 nike

嗯,我正在用 C 语言工作。我想创建一个返回矩阵 [][] 的函数。

这是我的功能:

char **mapa(int largo,int ancho)
{
char **matriz;
int i,j;
matriz = (char **)malloc(sizeof(char)*largo);
for(i = 0; i < largo; ++i)
{
matriz[i]= (char *)malloc(sizeof(char)*ancho);
}

for(i = 0; i < largo; i++)
{
for(j = 0; j < ancho; j++)
{
matriz[i][j] = 'k';
}
}

for(i = 0; i < largo; i++)
{
for (j = 0; j < ancho; j++)
{
printf("%c",matriz[i][j]);
}
}

return matriz;
}

使用 gdb 它给了我这个:

  Program received signal SIGSEGV, Segmentation fault.
0x00000000004008b8 in mapa (largo=10, ancho=10) at main.c:18
18 matriz[i][j] = 'k';

我不知道错误出在哪里,如果有人可以帮助我,我将非常感激。非常感谢。

最佳答案

char **matriz;
int i,j;
matriz = (char **)malloc(sizeof(char)*largo);

您的matriz变量是一个指向指针数组的指针,每个指针都指向一个char数组。首先需要为指针数组分配内存,这需要 largo 乘以指针的大小,即 sizeof (char *)。您只需分配 largo 乘以 single char 大小的空间。

获得正确分配的最简单方法是使用以下模式:

p = malloc (n * sizeof *p);

换句话说,分配 n 倍于 p 指向的大小。假设您得到了正确的 n,无论 p 的类型如何,这都会自动分配正确的数量。如果您在同一行中声明指针,它看起来会有点不同:

T *p = malloc (n * sizeof *p);  /* For some type T */

在这种情况下,两侧p之前都有一个星号。您必须意识到这种差异,尤其是当您有多个间接级别时。

使用此模式的第一次分配将如下所示:

matriz = malloc (largo * sizeof *matriz); 

第二个:

matriz[i] = malloc (ancho * sizeof *matriz[i]);

请注意,您永远不必强制转换 void 指针(malloc() 的返回值),并且 sizeof 运算符的参数仅在以下情况下需要括号:这是一个类型名称。当去掉括号并将数量 (ancho) 放在 sizeof 运算符之前时,结果是一个非常干净且易于理解的表达式。当然,这是我个人的观点。

关于c - 尝试用 C 语言创建矩阵时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25535721/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com