【问题标题】:Dynamic Memory Allocation in C ( return value 3221225477 & Segmentation fault: 11 )C 中的动态内存分配(返回值 3221225477 和分段错误:11)
【发布时间】:2020-06-26 11:04:50
【问题描述】:

谁能解释下面的代码有什么问题?如果我将“line”变量指定为 1、2、3 或 4,它会正确运行。但是在 4 之后它只是正确显示了行数,列数不正确。

dev-c/c++在windows上的输出>>“返回值3221225477”

gcc 在 mac 上的输出 >> "Segmentation fault: 11"

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

int main(){

int **matris;
int size;
int i, j;

printf( "Size >> " );
scanf( "%d", &size );

matris = (int **)malloc( size * sizeof(int) );

if( matris == NULL )
    printf( "It's required more memory'!" );

for( i = 0; i < size; i++ ) {
    matris[i] = malloc( size * sizeof(int) );
    if( matris[i] == NULL )
        printf( "It's required more memory'!!" );
}

for( i = 0; i < size; i++ ) {
    for( j = 0; j < size; j++ ){    
        matris[i][j]=i+1;
        printf( "%d ", matris[i][j] );
    }
    printf( "\n" );
}


for( i = 0; i < size; i++ ) {
    free( matris[i] );
}

free( matris );

return 0;
}

【问题讨论】:

  • (int **)malloc( size * sizeof(int) ); 看起来不对,应该是sizeof(int*)
  • matris = (int **)malloc( size * sizeof(int) ); 你不应该把malloc 的返回值转换成C。而且你没有分配正确的大小。 matrix 指向 int*,而不是 int
  • 在 gdb 中运行它,它会告诉你到底是什么问题。
  • 其他人已经发布了解决方案。尝试使用printf("int: %zu, ptr: %zu", sizeof(int), sizeof(int*)); 打印整数与整数指针的大小。在 x86_64/AMD64 机器上,这给了我int: 4, ptr: 8。这就是您的代码崩溃的原因。
  • 只需用 int (*matris)[j] = malloc(sizeof(int[size][size])); ... free(matris); 替换所有讨厌的、分段的错误。

标签: c arrays dynamic-memory-allocation


【解决方案1】:
matris = (int **)malloc( size * sizeof(int) );

尤其是( size * sizeof(int) ) 是错误的。您需要为int*(指向int 的指针)类型的对象分配内存,而不是int

如果sizeof(int) &lt; sizeof(int*) 在您的实现中,这是一个问题-> 翻译:指向int 类型的对象的大小大于int 类型的对象的大小,这很常见。

然后您会遇到分段错误,因为您在以下代码中访问了超出指针数组matris 边界的内存。

用途:

matris = malloc ( sizeof(int*) * size );

甚至更好

matris = malloc ( sizeof(*matris) * size );

旁注:

  • 您无需转换malloc() 的返回值。返回的指针会自动对齐。 Do I cast the result of malloc?

  • sizeof(*matris) 需要较少的维护,如果matris 的类型和指向的对象发生变化,则更安全。

  • 首先设置sizeof 操作以确保size_t 算术,因为sizeint 类型。

【讨论】:

    【解决方案2】:

    matris = (int **)malloc( size * sizeof(int) ); 行不正确,因为您要创建一个 int 指针数组而不是 int。将 int 更改为 int* 有效。

    【讨论】:

    • malloc( size * sizeof(int) ); 实际上创建了一个 int 数组,并且 OP 想要一个 int 指针数组。你的意思可能是相反的?
    • 嘿@Lundin,我的意思是另一种方式,感谢您的纠正。
    猜你喜欢
    • 1970-01-01
    • 2021-11-28
    • 2019-08-16
    • 2013-05-27
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    相关资源
    最近更新 更多