c-Malloc初始化一个空指针



嗨,我遇到了这种情况。我使用malloc给我一个由10个指针组成的数组。当我在gdb中看到测试指针时,其中一个(第三个)指向0x0。有时,当使用apple[2]->string="hello"时,代码会出错。malloc为什么这么做?提前感谢您的帮助。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int
main(void)
 {
  typedef struct test
    {
      char *string;
      int data;
    } test;
   test *apple[10];  // Declare an array of 10 test pointers. This line results in one of  the  pointers having a null value.
   apple[0] = malloc(sizeof(test));
   apple[0]->string = "hello";
   printf("The string is %sn",apple[0]->string);
   printf("Size of apple[0]->data is %dn",sizeof(apple[0]->data));
   printf("Size of tester is %dn",sizeof(test));
   free(apple[0]);
   return 0;
 }

我想看看指针数组是如何工作的。我并没有打算用掉所有的10分球。那么我只需要malloc我需要的东西吗?第三个指针是0x0,这是巧合吗?

内存只分配给apple中的第一个元素,因此只有apple[0]指向有效的struct test

apple的所有元素分配内存:

for (int i = 0; i < sizeof(apple) / sizeof(test*); i++)
{
    apple[i] = malloc(sizeof(test));
}

free()需要类似的循环。

test.stringchar*,所以像您所做的那样指向字符串文字是可以的(尽管类型应该是const char*)。如果要将字符串复制到test.string,则必须先将malloc()空间复制到中,然后再将其复制到free()中。

根据您的最终目标,有不同的方法。

如果每次运行程序时,数组中的元素数量都是恒定的,那么根本不必使用指针:

test apple[10]; // array with 10 instances of test
test[0].string = ...;
test[1].data = ...;

如果你想使用你的方法(使用指针,现在还没有必要),你必须对每个元素进行malloc()操作(就像你对apple[0]所做的那样,或者对整个数组进行malloc:

int num = 10;
test *apple = malloc(sizeof(test) * num);
// access any element here
apple[5].string = "hello!";
free(apple);

您只分配了test的一个实例,并将其分配给第一个数组元素:

apple[0] = malloc(sizeof(test));

要分配全部十个,您需要执行以下操作:

for (int i = 0; i < 10; i++) {
    apple[i] = malloc(sizeof(test));
}

相关内容

  • 没有找到相关文章