C 这是什么原因?(研究seg故障的原因)

C 这是什么原因?(研究seg故障的原因),c,segmentation-fault,C,Segmentation Fault,我只是在观察分段错误的原因。我在这里删除了内存,但还是给了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); } #包括 #包括 #包括

我只是在观察分段错误的原因。我在这里删除了内存,但还是给了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);

}
#包括
#包括
#包括
void main()
{
int**矩阵,i,j;
矩阵=malloc(sizeof(int));
**矩阵=10;
printf(“%d”,**矩阵);
}
存储和int的大小,whilist

sizeof(*int)
将大小存储到指向int的指针。您保留的是
int
的大小,而不是
*int
的大小。这就是问题的根源

如果您还想进行一些实际计算,那么您应该将int分配给*int指针

存储和int的大小,whilist

sizeof(*int)
将大小存储到指向int的指针。您保留的是
int
的大小,而不是
*int
的大小。这就是问题的根源


另外,如果您还想进行一些实际计算,您应该将int分配给*int指针。

矩阵是一个指针(它恰好是指向
int
的指针),并且您已经为它分配了内存(尽管可能不够)

*matrix
也是一个指针(它恰好是指向
int
的指针),并且您没有为它分配指向的内存,因此
*matrix
包含垃圾(或者如果您的
malloc()
调用没有分配足够的内存,它就不存在)

因此,解引用
*矩阵
具有未定义的行为。你很幸运,症状很明显

为什么要为指向的
矩阵
分配
sizeof(int)
字节


为什么要定义
void main()
而不是正确的
int main(void)
(void main()
最有用的方法是检测不太懂该语言的作者编写的书籍和教程。)

是一个指针(它恰好是指向
int
的指针),您已经为它分配了内存(尽管可能不够)

*matrix
也是一个指针(它恰好是指向
int
的指针),并且您没有为它分配指向的内存,因此
*matrix
包含垃圾(或者如果您的
malloc()
调用没有分配足够的内存,它就不存在)

因此,解引用
*矩阵
具有未定义的行为。你很幸运,症状很明显

为什么要为指向的
矩阵
分配
sizeof(int)
字节


为什么要定义
void main()
而不是正确的
int main(void)
<代码>(void main()
作为一种检测由不太懂该语言的作者编写的书籍和教程的方法非常有用。)

因为您没有正确分配内存<代码>矩阵
是指向整数指针的指针,而不仅仅是整数指针

正确的方法是:

(警告:我直接在浏览器上键入,请勿在生产中使用)

#包括
#包括
#包括
void main()
{
int**矩阵,i,j;
矩阵=(int**)malloc(sizeof(void*);
*矩阵=(int*)malloc(sizeof(void*);
**矩阵=10;
printf(“%d”,**矩阵);
自由(*矩阵);
自由(矩阵);
返回0;
}
通过想象每一行(地址|类型|值{value_类型})中的内存是什么样子,更容易理解发生了什么:

int**矩阵,i,j; 堆栈: 矩阵:0x00 |&int**| NULL{int**} i:0x04 |&int |垃圾{int} j:0x08 |&int |垃圾{int} 由于是虚拟内存,操作系统通常使用0(或NULL)初始化内存,但由于未授予此权限,因此使用该值进行计数是错误的编程

matrix = (int **) malloc(sizeof(void *)); 矩阵=(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 *} 堆栈: 矩阵:0x00 |&int**| 0xA0{int**} i:0x04 |&int |垃圾{int} j:0x08 |&int |垃圾{int} 堆: *矩阵:0xA0 |&int*|垃圾{int*} *矩阵=(int*)malloc(sizeof(void*); 堆栈: 矩阵:0x00 |&int**| 0xA0{int**} i:0x04 |&int |垃圾{int} j:0x08 |&int |垃圾{int} 堆: *矩阵:0xA0 |&int*| 0xA4{int*} **矩阵:0xA4 |&int |垃圾{int} **矩阵=10; 堆栈: 矩阵:0x00 |&int**| 0xA0{int**} i:0x04 |&int |垃圾{int} j:0x08 |&int |垃圾{int} 堆: *矩阵:0xA0 |&int*| 0xA4{int*} **矩阵:0xA4 |&int | 10{int}
因为您没有正确分配内存<代码>矩阵
是指向整数指针的指针,而不仅仅是整数指针

正确的方法是:

(警告:我直接在浏览器上键入,请勿在生产中使用)

#包括
#包括
#包括
void main()
{
int**矩阵,i,j;
矩阵=(int**)malloc(sizeof(void*);
*矩阵=(int*)malloc(sizeof(void*);
**矩阵=10;
printf(“%d”,**矩阵);
自由(*矩阵);
自由(矩阵);
返回0;
}
通过想象每一行(地址|类型|值{value_类型})中的内存是什么样子,更容易理解发生了什么:

int**矩阵,i,j; 堆栈: 矩阵:0x00 |&int**| NULL{int**} i:0x04 |&int |垃圾{int} j:0x08 |&int |垃圾{int} 由于是虚拟内存,操作系统通常使用0(或NULL)初始化内存,但由于未授予此权限,因此使用该值进行计数是错误的编程

matrix = (int **) malloc(sizeof(void *)); 矩阵=(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 *} 堆栈: 矩阵:0x00 |&int**| 0xA0{int**} i:0x04 |&int |垃圾{int} j:0x08 |&int |服装 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}