0

我只是在观察分段错误的原因。我在这里分配了内存,但它仍然给出了段错误。这可能是什么原因?

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>

void main()
{
    int **matrix,i,j;
    matrix = malloc(sizeof(int));
    **matrix = 10;
    printf("%d", **matrix);

}
4

3 回答 3

2

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

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

所以取消引用*matrix具有未定义的行为。你很幸运,症状很明显。

为什么要为指向分配sizeof(int)字节?matrix

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

于 2013-03-21T00:45:41.167 回答
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 **矩阵,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}
于 2013-03-21T01:38:48.833 回答
0
sizeof(int)

存储大小和 int、whilist

sizeof(*int)

将大小存储到指向 int 的指针。您保留的是 a 的大小,int而不是 a 的大小*int。这就是造成问题的原因。

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

于 2013-03-21T00:44:50.577 回答