Ale*_*lex 2 c malloc int short
我试图创建一个动态比例的矩阵,并在这里初始化它是我用来分配内存和初始化的代码:
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;
Run Code Online (Sandbox Code Playgroud)
这个,工作得很好,问题是,如果我尝试创建一个short类型的矩阵 - 我在init第一次传递时得到分段错误.
这是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;
Run Code Online (Sandbox Code Playgroud)
PS:为了清晰的代码,我放弃了安全检查,索引变量和边界声明.
谢谢,
亚历克斯
Ale*_*x B 17
您的返回值的强制转换malloc()无效.他们应该是int**和int*在第一种情况下,与short**和short*第二.
当您转换malloc()to 的返回值时short,返回的指针将被截断以适合short值,然后被赋值给short*指针,从而产生指向无效内存位置的指针值.因此,您尝试访问它时会出现分段错误.
有了int,你很幸运,因为在你的平台上很可能sizeof(int)==sizeof(int*),所以通过malloc()casted 返回的指针int不会被截断,而且它都可以无声地工作.它很可能在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;
Run Code Online (Sandbox Code Playgroud)
如果你的代码是纯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;
Run Code Online (Sandbox Code Playgroud)
小智 15
您使用的是什么编译器,它不会对您发出关于所有这些明显错误的尖叫声?
gcc -Wall 使用此代码生成了五条警告消息.
#include <stdlib.h>
int main ()
{
int mat_w = 99;
int mat_h = 666;
int i;
int j;
int **imatrix;
short **smatrix;
//mem allocation
imatrix=(int*)malloc(sizeof(int*)*mat_w);
for (i=0;i<mat_w;i++)
imatrix[i]=(int)malloc(sizeof(int)*mat_h);
//init
for (i=0;i<mat_w;i++)
for (j=0;j<mat_h;j++)
imatrix[i][j]=0;
//mem allocation
smatrix=(short*)malloc(sizeof(short*)*mat_w);
for (i=0;i<mat_w;i++)
smatrix[i]=(short)malloc(sizeof(short)*mat_h);
//init
for (i=0;i<mat_w;i++)
for (j=0;j<mat_h;j++)
smatrix[i][j]=0;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
给我
malloc.c: In function 'main':
malloc.c:13: warning: assignment from incompatible pointer type
malloc.c:15: warning: assignment makes pointer from integer without a cast
malloc.c:22: warning: assignment from incompatible pointer type
malloc.c:24: warning: cast from pointer to integer of different size
malloc.c:24: warning: assignment makes pointer from integer without a cast
Run Code Online (Sandbox Code Playgroud)
你必须从这个错误中吸取教训.它说如下:永远不会投出'malloc'的结果.
此外,这是一个更好的实践gudeline的一部分,只要有可能,最好遵循:除了声明之外,不要在代码中提及类型名称.
这是您的代码应该从一开始就看起来的样子
int **matrix;
matrix = malloc(mat_w * sizeof *matrix);
for (i = 0; i < mat_w; i++)
matrix[i] = malloc(mat_h * sizeof *matrix[i]);
for (i = 0; i < mat_w; i++)
for (j = 0; j < mat_h; j++)
matrix[i][j] = 0;
Run Code Online (Sandbox Code Playgroud)
注意,为了在这个版本中从'int'切换到'short',你只需要改变'matrix'的声明,而不是其他任何东西.
(当然,在这段代码中可以改进更多内容,但我只是想解决错误的直接原因.)
您在您铸造int**到int*的malloc(相同的简称)的返回值.malloc应该用作:
matrix = (int**)malloc(sizeof(int*) * mat_w);
Run Code Online (Sandbox Code Playgroud)
要么
matrix = (short**)malloc(sizeof(short*) * mat_w);
Run Code Online (Sandbox Code Playgroud)
矩阵内的每个分配都相同:
matrix[i] = (int*)malloc(sizeof(int) * mat_h);
Run Code Online (Sandbox Code Playgroud)
要么
matrix[i] = (short*)malloc(sizeof(short) * mat_h);
Run Code Online (Sandbox Code Playgroud)