gpt4 book ai didi

c - 当我更改在 C 中分配双指针的方式时,会导致段错误

转载 作者:行者123 更新时间:2023-11-30 20:35:40 24 4
gpt4 key购买 nike

我尝试了两种方法来 malloc 双指针,但其中一种会导致段错误。我问这个问题是否可以得到答案为什么..(试图找到答案,但找不到已解决的问题。)

这是我的代码:

  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() 返回段错误。看来我不应该在malloc所有双指针指向的单指针之前赋值任何值。

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

最佳答案

代码混合了索引。

这个

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

应该是

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

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

关于c - 当我更改在 C 中分配双指针的方式时,会导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38419567/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com