我只是在观察分段错误的原因。我在这里分配了内存,但它仍然给出了段错误。这可能是什么原因?
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
void main()
{
int **matrix,i,j;
matrix = malloc(sizeof(int));
**matrix = 10;
printf("%d", **matrix);
}
我只是在观察分段错误的原因。我在这里分配了内存,但它仍然给出了段错误。这可能是什么原因?
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
void main()
{
int **matrix,i,j;
matrix = malloc(sizeof(int));
**matrix = 10;
printf("%d", **matrix);
}
matrix
是一个指针(它恰好是一个指向 的指针int
),并且您已经分配了内存(尽管可能还不够)让它指向。
*matrix
也是一个指针(它恰好是一个指向 的指针int
),并且您没有为其指向的内存分配内存,因此*matrix
包含垃圾(或者如果您的malloc()
调用没有分配足够的内存,则不存在)。
所以取消引用*matrix
具有未定义的行为。你很幸运,症状很明显。
为什么要为指向分配sizeof(int)
字节?matrix
你为什么要定义void main()
而不是正确的int main(void)
?(void main()
最有用的方法是检测那些不太了解该语言的作者所写的书籍和教程。)
因为您没有正确分配内存。matrix
是一个指向整数指针的指针,而不仅仅是一个整数指针。
正确的方法是:
(警告:我直接在浏览器上输入,不要在生产中使用)
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
void main()
{
int **matrix,i,j;
matrix = (int **) malloc(sizeof(void *));
*matrix = (int *) malloc(sizeof(void *));
**matrix = 10;
printf("%d", **matrix);
free(*matrix);
free(matrix);
return 0;
}
通过想象内存在每一行中的样子(地址 | 类型 | 值 {value_type})会更容易理解发生了什么:
int **矩阵,i,j;
堆: 矩阵:0x00 | &int ** | 空{int **} 我:0x04 | &int | 垃圾{int} j: 0x08 | &int | 垃圾{int}
因为虚拟内存,操作系统通常使用 0(或 NULL)初始化内存,但由于没有授予它,因此计算它是不好的编程。
矩阵 = (int **) malloc(sizeof(void *));
malloc 将返回堆上空间的地址:
堆: 矩阵:0x00 | &int ** | 0xA0 {int **} 我:0x04 | &int | 垃圾{int} j: 0x08 | &int | 垃圾{int} 堆: *矩阵:0xA0 | &int * | 垃圾{int *}
*matrix = (int *) malloc(sizeof(void *));
堆: 矩阵:0x00 | &int ** | 0xA0 {int **} 我:0x04 | &int | 垃圾{int} j: 0x08 | &int | 垃圾{int} 堆: *矩阵:0xA0 | &int * | 0xA4 {int *} **矩阵:0xA4 | &int | 垃圾{int}
**矩阵 = 10;
堆: 矩阵:0x00 | &int ** | 0xA0 {int **} 我:0x04 | &int | 垃圾{int} j: 0x08 | &int | 垃圾{int} 堆: *矩阵:0xA0 | &int * | 0xA4 {int *} **矩阵:0xA4 | &int | 10 {int}
sizeof(int)
存储大小和 int、whilist
sizeof(*int)
将大小存储到指向 int 的指针。您保留的是 a 的大小,int
而不是 a 的大小*int
。这就是造成问题的原因。
此外,如果您还想进行一些实际计算,您应该将 int 分配给 *int 指针。