【问题标题】:dynamic allocation of array of pointers指针数组的动态分配
【发布时间】:2012-09-16 18:42:55
【问题描述】:

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

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

感谢您对此事的任何帮助。

【问题讨论】:

  • 我基本上是想动态分配一个指针数组。
  • 在你先给ptr一个值之前,你不能做*ptr。这就是它出现段错误的原因。
  • *ptr = (int *)malloc(10 * sizeof (*val)); 只是分配 10*intsize。不知道你在做什么
  • @ams,你得到了 ant seg-fault???
  • @rjayavrp 当我阅读代码时,我脑子里有一个。这很痛。如果你没有得到一个,那么你只是幸运。

标签: c pointers segmentation-fault malloc


【解决方案1】:
int **ptr; 
*ptr = (int *)malloc(10 * sizeof (*val));

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

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

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

现在ptr 指向一个足够大的内存以容纳10 指向int 的指针。
现在可以使用ptr[i] 访问每个本身是指针的数组元素,其中,

i < 10

【讨论】:

  • 但是为什么它在其他机器上没有显示段错误,而对我来说却显示?
  • @VivekSethi 当你犯这样的错误时,你就是在调用未定义的行为。不保证您会遇到分段错误;这只是取消引用 some 无效内存位置的结果。由于您的指针未初始化并持有一些任意的、未知的底层值(通常是其他函数或程序留下的任何内容),因此您取消引用哪个无效内存位置本质上是运气。所以你看,这是否会被“抓住”是完全不确定的。
  • 当您声明指针时,它会接收到计算机提供给它的内存中的某个值。那么有两种选择: 1. 如果该值是一个有效的指针,在您的程序分配的内存中,它不会因分段错误而死。不过,您可能正在写入其他数据。 2. 如果该值不在程序的内存中,那么您正在尝试使用不属于您的进程(或无效)的内存,因此您会遇到分段错误。这和上面说的Lightness一样,只是换个说法。
【解决方案2】:
#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;
}

【讨论】:

    【解决方案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;
    }
    

    希望这会有所帮助.. ;).

    【讨论】:

    • 嗯,这不是我想要的。无论如何,它确实在我的脑海中清除了一些东西。谢谢。
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      包括

      包括

      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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-26
        • 2020-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多