我尝试了两种方法来使用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之前为双指针指向的所有单个指针分配任何值。
但是你可以解释一下原因吗?
答案 0 :(得分:0)
代码混合索引。
此
*(*(dp+j)+i) = i*j;
应该是
*(*(dp+i)+j) = i*j;
由于两个维度相同,因此与第一个代码段无关。