2016-09-20 69 views
2

我在C代码中发现了一个段错误,并且在搜索后找不到一个好的解释或解决方案。导致段错误的int指针的动态数组

这第一个代码给我打印0

#include <stdlib.h> 
#include <stdio.h> 
int main() { 
    int **defs = malloc(16 * sizeof *defs); 
    int i; 
    for (i = 0; i < 16; i++) { 
     printf("%d\n", i); 
     *defs[i] = i; 
    } 
    free(defs); 
    return 0; 
} 

这第二个代码工作正常,后段故障。

#include <stdlib.h> 
#include <stdio.h> 
int main() { 
    int *defs = malloc(16 * sizeof defs); 
    int i; 
    for (i = 0; i < 16; i++) { 
     printf("%d\n", i); 
     defs[i] = i; 
    } 
    free(defs); 
    return 0; 
} 

这些只是例子,不是我的实际代码。我也试过做指针算术,但结果相同。 有人能解释一下吗?谢谢。

+2

'* defs [i]'。在这之前,你需要初始化'defs [i]'指向某处。 –

+1

指针必须指向某个地方才能被取消引用 –

回答

4

在第一个代码中,您尚未分配每个int*内存块。 因此,在将值分配给defs[i]之前,您必须使用int*类型的内存填充它。

defs[i] = (int*)malloc(sizeof(int) * number_of_elements); 

然后defs[i][some_index] = value

+0

在我的情况下,在循环中添加'def [i] = malloc(sizeof(int));'。谢谢。 – Munir

+0

你的'def [i]'只能存储1个元素....但你可以存储多于1个元素。但是你应该总是避免....可能发生分段错误。 –

+0

@Munir ...恩。为什么你要在堆上分配单个的“int”呢?为什么你甚至要创建一个指针数组而不是'int'数组,而你为什么使用'malloc'而不是'new'? –