gpt4 book ai didi

c - C 中奇怪的 malloc 行为

转载 作者:行者123 更新时间:2023-12-04 02:54:16 24 4
gpt4 key购买 nike

我正在尝试创建一个具有动态比例的矩阵并对其进行初始化这是我用来分配内存和初始化的代码:

int **matrix;
//mem allocation
matrix=(int*)malloc(sizeof(int*)*mat_w);
for (i=0;i<mat_w;i++)
matrix[i]=(int)malloc(sizeof(int)*mat_h);
//init
for (i=0;i<mat_w;i++)
for (j=0;j<mat_h;j++)
matrix[i][j]=0;

这工作正常,问题是,如果我尝试创建一个 short 类型的矩阵 - 我在初始化第一遍时遇到段错误。

这是 C 语言的问题还是我做错了什么?

short 类型矩阵的代码:

short **matrix;
//mem allocation
matrix=(short*)malloc(sizeof(short*)*mat_w);
for (i=0;i<mat_w;i++)
matrix[i]=(short)malloc(sizeof(short)*mat_h);
//init
for (i=0;i<mat_w;i++)
for (j=0;j<mat_h;j++)
matrix[i][j]=0;

P.S.:为了代码的清晰,我放弃了安全检查、索引变量和边界声明。

谢谢,
亚历克斯

最佳答案

您对 malloc() 返回值的转换无效。它们在第一种情况下应该是 int**int* ,在第二个。

当您将 malloc() 的返回值转换为 short 时,返回的指针会被截断以适应 short 值,然后被分配给一个 short* 指针,产生一个指向无效内存位置的指针值。因此,您在尝试访问它时会遇到段错误。

有了 int,您就走运了,因为在您的平台上很可能是 sizeof(int)==sizeof(int*),所以 返回的指针转换为 int 的 code>malloc() 不会被截断,并且一切正常。它很可能会在 64 位平台上以类似的方式崩溃。

应该是:

short **matrix;
matrix=(short**)malloc(sizeof(short*)*mat_w);
for (i=0;i<mat_w;i++)
matrix[i]=(short*)malloc(sizeof(short)*mat_h);
for (i=0;i<mat_w;i++)
for (j=0;j<mat_h;j++)
matrix[i][j]=0;

如果您的代码是纯 C(而非 C++),您可以省略强制转换,因为在 C 中从 void* 到任何其他指针类型的强制转换都是有效的。

short **matrix;
matrix = malloc(sizeof(short*)*mat_w);
for (i=0;i<mat_w;i++)
matrix[i] = malloc(sizeof(short)*mat_h);
for (i=0;i<mat_w;i++)
for (j=0;j<mat_h;j++)
matrix[i][j]=0;

关于c - C 中奇怪的 malloc 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1554238/

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