以下代码给出了分段错误。我无法弄清楚为什么。请参阅..
#include <stdio.h>
#include <stdlib.h>
int main()
{
int **ptr;
int *val;
int x = 7;
val = &x;
*ptr = (int *)malloc(10 * sizeof (*val));
*ptr[0] = *val;
printf("%d\n", *ptr[0] );
return 0;
}
关于使用gdb进行调试,它说:
Program received signal SIGSEGV, Segmentation fault.
0x0804843f in main () at temp.c:10
*ptr = (int *)malloc(10 * sizeof (*val));
对此事有任何帮助表示赞赏。
答案 0 :(得分:9)
int **ptr;
*ptr = (int *)malloc(10 * sizeof (*val));
第一个语句声明一个双指针 第二次取消引用指针。为了能够取消引用它,指针应该指向一些有效的内存。因此不会出现seg错误。
如果你需要为你需要的指针数组分配足够的内存:
ptr = malloc(sizeof(int *) * 10);
现在ptr
指向一个足以容纳10
指针int
的内存。
现在可以使用ptr[i]
where,
i < 10
答案 1 :(得分:3)
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int **ptr;
int x;
x = 5;
ptr = malloc(sizeof(int *) * 10);
ptr[0] = &x;
/* etc */
printf("%d\n", *ptr[0]);
free(ptr);
return 0;
}
答案 2 :(得分:1)
参见下面的程序,或许,它有助于更好地理解。
#include<stdio.h>
#include <stdlib.h>
int main(){
/* Single Dimention */
int *sdimen,i;
sdimen = malloc ( 10 * sizeof (int));
/* Access elements like single diminution. */
sdimen[0] = 10;
sdimen[1] = 20;
printf ("\n.. %d... %d ", sdimen[0], sdimen[1]);
/* Two dimention ie: **Array of pointers.** */
int **twodimen;
twodimen = malloc ( sizeof ( int *) * 10);
for (i=0; i<10; i++) {
twodimen[i] = malloc (sizeof(int) * 5);
}
/* Access array of pointers */
twodimen[0][0] = 10;
twodimen[0][3] = 30;
twodimen[2][3] = 50;
printf ("\n %d ... %d.... %d ", twodimen[0][0], twodimen[0][3], twodimen[2][3]);
return 0;
}
希望这有助于..;)。
答案 3 :(得分:0)
从概念上讲,如果你正在使用** ptr,那么你需要为ptr&amp; amp; alloacte memory * ptr to defrence ** ptr。
但是在你的情况下,如果你的编译器足够智能,那么你只为* ptr释放内存 它的plo(一个指针位置)的alloacting内存链接* ptr,因此它能够链接ptr-&gt; ptr-&gt; * ptr.Hence你没有得到Seg Fault。
答案 4 :(得分:0)
int main()
{
int **ptr;
int *val;
int x = 7;
val = &x;
ptr = (int**)malloc(sizeof(int**));
*ptr = (int *)malloc(10 * sizeof (*val));
*ptr[0] = *val;
printf("%d\n", *ptr[0] );
return 0;
}
上面会有用。 您可以找到差异并理解原因。
您没有为其分配内存,而是取消引用** ptr的底线。