【问题标题】:Issues with mallocmalloc 的问题
【发布时间】:2012-09-25 09:00:34
【问题描述】:

使用malloc()为二维数组分配内存时,当输入大小(矩阵N*N)大于5(即N>5)时会出现分段错误。

对于小于5 的输入(N),以下代码可以正常工作。

您能帮我解决问题吗?

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

int main(){
    int n;
    int i,j;
    int **adj;
    //reading size of a N*N matrix
    scanf("%d",&n);

    //dynamically allocating memory for a 2-dimensional array
    adj=(int**)malloc(sizeof(int)*n);
    for(i=0;i<n;i++){
        adj[i]=(int*)malloc(sizeof(int)*n);
    }

    //taking input from the file        
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            scanf("%d",&adj[i][j]);
        }
    }

    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            printf("%d\t",adj[i][j]);
        }
        printf("\n");
    }
    return 0;
}

【问题讨论】:

  • 如果 N 是每个数组的常数,最好将它重新排列为一维数组并通过简单的 N 乘法计算元素索引。除此之外,它应该是 adj=(int**)malloc(sizeof(int*)*n);跨度>
  • 我希望它只是一个糟糕的复制粘贴?

标签: c multidimensional-array malloc


【解决方案1】:

这是不正确的:

adj=(int**)malloc(sizeof(int)*n);

当您分配int* 的数组时,而不是int。改为:

adj = malloc(sizeof(int*)*n); /* Cast unnecessary. */
/* or: adj = malloc(sizeof(*adj)*n); */

建议检查scanf() 的返回值以确保正确读取int

if (1 == scanf("%d", &n))
{
}

有用的阅读:Do I cast the result of malloc?

【讨论】:

  • 为了帮助 OP 理解原因,这是因为在 64 位平台上,指针是 64 位(即 8 字节),而 int 是 32 位(即 4 字节)。所以用sizeof(int) 调用malloc 意味着分配的内存将是所需内存的一半
  • 机器上整数的大小取决于底层操作系统和架构的组合。如果操作系统(加上 GCC)在 64 位机器上是 64 位,那么整数和指针也需要 8 个字节(64 位)......不是吗?
【解决方案2】:
adj=(int**)malloc(sizeof(int)*n);

替换为

adj = (int**)malloc(sizeof(int*) * n);

因为一般sizeof(int*) != sizeof(int)

还有一个提示:初始化你的变量!!!

【讨论】:

    【解决方案3】:

    除了hmjd 指针外,也许它可以提供更多信息。

    int p -> p 是 int 类型。

    int * p -> p 是指针 (*p) 类型,指向 'int"

    int ** p -> p 是指针 (*p) 类型,指向“指向 int 的指针,即:(int *)”

    如果是从左到右读,会更容易理解。

    int ** adj -> 你需要两个指针解引用(**)才能达到值'int'。

    ie: 'adj' 指向的内存数组中的每个位置都应该保存另一块内存的地址。因此,您需要提供 sizeof(int *),同时分配 'adj'。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-26
      • 2018-07-06
      • 1970-01-01
      • 1970-01-01
      • 2011-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多