当我更改C中的双指针malloc时,会导致Seg错误

时间:2016-07-17 09:03:38

标签: c pointers segmentation-fault malloc

我尝试了两种方法来使用malloc双指针,但其中一种方法导致了seg错误。 我问这个问题,如果我能得到答案为什么.. (试图找到答案,但无法在此找到解决的问题。)

这是我的代码:

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 #define N 3
  5 
  6 void printDPWithEarlyInit();
  7 void printDPWithDynamicInit();
  8 
  9 int main(){
 10     printDPWithEarlyInit();
 11     printDPWithDynamicInit();
 12     return 0;
 13 }
 14 
 15 void printDPWithEarlyInit(){
 16     printf("### printDPWithEarlyInit() ###\n");
 17     int** dp = malloc(N*sizeof(int*));
 18     *(dp+0) = malloc(N*sizeof(int));
 19     *(dp+1) = malloc(N*sizeof(int));
 20     *(dp+2) = malloc(N*sizeof(int));
 21 
 22     for(int i=0; i<N; i++){
 23         for(int j=0; j<N; j++){
 24             *(*(dp+j)+i) = i*j;
 25         }
 26     }
 27 
 28     for(int i=0; i<N; i++){
 29         for(int j=0; j<N; j++){
 30             printf("%d\t", *(*(dp+j)+i));
 31         }
 32         printf("\n");
 33     }
 34 }
 35 
 36 void printDPWithDynamicInit(){
 37     printf("### printDPWithDynamicInit() ###\n");
 38 
 39     int** dp = malloc(N*sizeof(int*));
 40 
 41     for(int i=0; i<N; i++){
 42         *(dp+i) = malloc(N*sizeof(int));
 43         for(int j=0; j<N; j++){
 44             *(*(dp+j)+i) = i*j;
 45         }
 46     }
 47 
 48     for(int i=0; i<N; i++){
 49         for(int j=0; j<N; j++){
 50             printf("%d\t", *(*(dp+j)+i));
 51         }
 52         printf("\n");
 53     }
 54 }

当我运行此程序时, 第一个方法printDPWithEarlyInit(),没有错误。

打印出来:

0 0 0

0 1 2

0 2 4

但第二种方法printDPWithDynamicInit()返回seg fault。 看来我不应该在malloc之前为双指针指向的所有单个指针分配任何值。

但是你可以解释一下原因吗?

1 个答案:

答案 0 :(得分:0)

代码混合索引。

 *(*(dp+j)+i) = i*j;

应该是

 *(*(dp+i)+j) = i*j;

由于两个维度相同,因此与第一个代码段无关。