分段错误:使用双指针动态分配矩阵
Segmentation Fault: Dynamically allocating matrix using a double pointer
试图了解C中双指针的用法和内存分配
下面是我的代码:-
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
printf("Enter rows and columns respectively: -\n");
int rows, columns;
scanf("%d%d", &rows, &columns);
int **matrix;
matrix = calloc(rows, sizeof(int));
int i, j;
for(i = 0; i < rows; i++)
{
matrix[i] = calloc(columns, sizeof(int));
}
printf("Enter your elements\n");
for(i = 0; i < rows; i++)
{
for(j = 0; j < columns; j++)
{
scanf("%d", &matrix[i][j]);
}
}
printf("Your elements are: -\n");
for(i = 0; i < rows; i++)
{
for(j = 0; j < columns; j++)
{
printf("%d ", matrix[i][j]);
}
printf("\n");
}
free(matrix);
return 0;
}
得到Segmentation fault: 11
后,在网上搜索了一下,发现不是这样写的:-
int **matrix;
matrix = calloc(rows, sizeof(int));
我应该写:-
int **matrix;
matrix = calloc(rows, sizeof(int*));
进行上述更改后,我的代码工作正常。
我的问题是:-
- What is the difference between sizeof(int) and sizeof(int *)?
- Don't both of them allocate 4 bytes? (int occupies 4 bytes and int*
(which is noting but a pointer) also occupies 4 bytes?
- If both of them allocates the same space, then why was I getting a
Segmentation fault in the first case?
Don't both of them allocate 4 bytes? (int occupies 4 bytes and int* (which is noting but a pointer) also occupies 4 bytes?
是什么让您认为指针是四个字节?在大多数现代(64 位)体系结构中,指向对象的指针是 8 个字节,而不是 4 个字节。
因此,一般来说sizeof(int) ≠ sizeof(int *)
。但是你不能对可移植 C 代码中对象的大小做出很多假设,你绝对不能假设 sizeof(int) == 4
或 sizeof(int*) == 8
(也不是 4
)。根据平台的不同,这些大小会有所不同。它们 可以 也具有相同的大小。你只是不能假设。
为了避免指针和指针大小之间的混淆,有些人(包括我在内)建议在分配的 sizeof
表达式中使用 对象名称 ,而不是类型姓名:
int **matrix = calloc(rows, sizeof *matrix);
// …
matrix[i] = calloc(columns, sizeof **matrix);
这清楚地表明了您要分配的内容。请注意 sizeof expr
不会 评估 expr
;这很重要,因为表达式 *matrix
和 **matrix
在分配内存之前是 无效的 — 引用未分配的指针将是未定义的行为。但是 sizeof
只确定了表达式的对象大小,而没有实际计算它。
试图了解C中双指针的用法和内存分配
下面是我的代码:-
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
printf("Enter rows and columns respectively: -\n");
int rows, columns;
scanf("%d%d", &rows, &columns);
int **matrix;
matrix = calloc(rows, sizeof(int));
int i, j;
for(i = 0; i < rows; i++)
{
matrix[i] = calloc(columns, sizeof(int));
}
printf("Enter your elements\n");
for(i = 0; i < rows; i++)
{
for(j = 0; j < columns; j++)
{
scanf("%d", &matrix[i][j]);
}
}
printf("Your elements are: -\n");
for(i = 0; i < rows; i++)
{
for(j = 0; j < columns; j++)
{
printf("%d ", matrix[i][j]);
}
printf("\n");
}
free(matrix);
return 0;
}
得到Segmentation fault: 11
后,在网上搜索了一下,发现不是这样写的:-
int **matrix;
matrix = calloc(rows, sizeof(int));
我应该写:-
int **matrix;
matrix = calloc(rows, sizeof(int*));
进行上述更改后,我的代码工作正常。
我的问题是:-
- What is the difference between sizeof(int) and sizeof(int *)?
- Don't both of them allocate 4 bytes? (int occupies 4 bytes and int* (which is noting but a pointer) also occupies 4 bytes?
- If both of them allocates the same space, then why was I getting a Segmentation fault in the first case?
Don't both of them allocate 4 bytes? (int occupies 4 bytes and int* (which is noting but a pointer) also occupies 4 bytes?
是什么让您认为指针是四个字节?在大多数现代(64 位)体系结构中,指向对象的指针是 8 个字节,而不是 4 个字节。
因此,一般来说sizeof(int) ≠ sizeof(int *)
。但是你不能对可移植 C 代码中对象的大小做出很多假设,你绝对不能假设 sizeof(int) == 4
或 sizeof(int*) == 8
(也不是 4
)。根据平台的不同,这些大小会有所不同。它们 可以 也具有相同的大小。你只是不能假设。
为了避免指针和指针大小之间的混淆,有些人(包括我在内)建议在分配的 sizeof
表达式中使用 对象名称 ,而不是类型姓名:
int **matrix = calloc(rows, sizeof *matrix);
// …
matrix[i] = calloc(columns, sizeof **matrix);
这清楚地表明了您要分配的内容。请注意 sizeof expr
不会 评估 expr
;这很重要,因为表达式 *matrix
和 **matrix
在分配内存之前是 无效的 — 引用未分配的指针将是未定义的行为。但是 sizeof
只确定了表达式的对象大小,而没有实际计算它。