【发布时间】: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