7

以下代码给出了分段错误。我不知道为什么。请参见..

#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));

任何有关此事的帮助表示赞赏。

4

5 回答 5

12
int **ptr; 
*ptr = (int *)malloc(10 * sizeof (*val));

第一条语句声明了一个双指针。
第二个取消引用指针。为了能够取消引用它,指针应该指向一些有效的内存。它不会因此出现段错误。

如果您需要为指针数组分配足够的内存,您需要:

ptr = malloc(sizeof(int *) * 10); 

现在ptr指向一个足够大的内存来保存10指向int.
现在可以使用ptr[i]where 访问每个本身是指针的数组元素,

i < 10
于 2012-09-25T09:17:30.490 回答
4
#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;
}
于 2012-09-25T09:19:22.793 回答
3

看下面的程序,也许有助于更好地理解。

#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;
}

希望这可以帮助.. ;)。

于 2012-09-25T09:34:18.990 回答
0

从概念上讲,如果您正在使用 **ptr,那么您需要为 ptr 和 *ptr 分配内存以防御 **ptr。

但是在你的情况下,你只为*ptr分配内存,如果你的编译器足够聪明,它为ptr(一个指针位置)分配内存以链接*ptr,因此它可以链接ptr-> ptr-> *ptr.Hence你没有得到 Seg Fault。

于 2013-03-20T07:58:01.850 回答
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。

于 2017-06-20T11:19:16.413 回答