我只是观察分段错误的原因。我在这里使用了内存,但它仍然给出了seg错误。可能是什么原因?
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
void main()
{
int **matrix,i,j;
matrix = malloc(sizeof(int));
**matrix = 10;
printf("%d", **matrix);
}
答案 0 :(得分:2)
matrix
是一个指针(它恰好是指向int
的指针),并且你已经分配了内存(尽管可能还不够),它指向它。
*matrix
也是一个指针(它恰好是指向int
的指针),并且你没有分配内存供它指向,所以{{ 1}}包含垃圾(如果你的*matrix
调用没有分配足够的内存,则不存在)。
因此解除引用malloc()
具有未定义的行为。你很幸运,症状很明显。
为什么要为*matrix
分配sizeof(int)
字节指向?
为什么要定义matrix
而不是正确的void main()
? int main(void)
作为一种检测由不熟悉该语言的作者撰写的书籍和教程的方法非常有用。)
答案 1 :(得分:1)
因为您没有正确分配内存。 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 **matrix,i,j;
stack: matrix: 0x00 | &int ** | NULL {int **} i: 0x04 | &int | GARBAGE {int} j: 0x08 | &int | GARBAGE {int}
因为虚拟内存,操作系统通常会使用0(或NULL)初始化内存,但由于未授予此内容,因此使用它进行计数是不好的编程。
matrix = (int **) malloc(sizeof(void *));
malloc将返回堆上空间的地址:
stack: matrix: 0x00 | &int ** | 0xA0 {int **} i: 0x04 | &int | GARBAGE {int} j: 0x08 | &int | GARBAGE {int} heap: *matrix: 0xA0 | &int * | GARBAGE {int *}
*matrix = (int *) malloc(sizeof(void *));
stack: matrix: 0x00 | &int ** | 0xA0 {int **} i: 0x04 | &int | GARBAGE {int} j: 0x08 | &int | GARBAGE {int} heap: *matrix: 0xA0 | &int * | 0xA4 {int *} **matrix:0xA4 | &int | GARBAGE {int}
**matrix = 10;
stack: matrix: 0x00 | &int ** | 0xA0 {int **} i: 0x04 | &int | GARBAGE {int} j: 0x08 | &int | GARBAGE {int} heap: *matrix: 0xA0 | &int * | 0xA4 {int *} **matrix:0xA4 | &int | 10 {int}
答案 2 :(得分:0)
sizeof(int)
存储大小for和int,whilist
sizeof(*int)
将size存储到指向int的指针。您保留int
的大小,而不是*int
的大小。这就是造成问题的原因。
如果你还想做一些真正的计算,你也应该将int分配给* int指针。