【问题标题】:Seg fault is caused when I change how I malloc a double pointer in C当我更改在 C 中分配双指针的方式时,会导致 Seg 错误
【发布时间】:2016-07-17 09:03:38
【问题描述】:

我尝试了两种方法来 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 错误。 看来我不应该在malloc之前给双指针指向的所有单指针赋值。

但是你能解释一下原因吗?

【问题讨论】:

  • *(*(dp+j)+i)...真的吗?
  • 天啊....多么愚蠢的错误..
  • 你知道*(x+y)和x[y]一模一样吗?也许后一种形式在视觉上更容易一些,也许,只是也许,它可以更快地发现错误。
  • @n.m.是的,我也在使用该约定(更频繁)。我只是在这个例子中使用了 *(x+y) 约定,也许这让我犯了这个愚蠢的错误..
  • 为了便于阅读,将*(dp+i) 更改为dp[i],将*(*(dp+j)+i) 更改为dp[j][i](当然,正如之前的答案和此处的cmets 所述,当您'完成)。

标签: c pointers segmentation-fault malloc


【解决方案1】:

代码混合了索引。

这个

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

应该是

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

由于两个维度相同,这与第一个 sn-p 无关。

【讨论】:

    猜你喜欢
    • 2018-03-05
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-09
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多