【问题标题】:Memory allocation for a char ** pointer in CC中char **指针的内存分配
【发布时间】:2014-08-13 09:10:55
【问题描述】:

我必须维护一个字符串数组,每个字符串都包含邻居的 IP 地址。出于某种原因,我需要将它们维护为字符串。

 typedef struct _neighbors
 {
      int num_neigbors;
      char **neighbor_address;
 } neighbors;

假设我有两个邻居要添加。

我将char ** neighbor_address 视为char * 指针数组。

我知道我需要为neighbor_address[0]neighbor_address[1] 使用malloc 内存来存储他们的IP 地址。由于 IP 地址的格式为“x.y.z.w”,因此我将使用 malloc7*sizeof (char)

我的疑问是我应该为基础char **neighbor_address 分配多少内存。是不是应该是4个字节才能存储neighbor_address[0]的基指针IP地址?

我这样说是因为如果我不执行malloc 如下所示,我会得到SIGSEGV(分段错误):

neighbor_address = malloc (1, sizeof (char *));

我错过了什么?

【问题讨论】:

  • 7 个字符(例如,\0 的 6 + 1)对于 IP 地址来说太少了,如果您想将其保存为字符串。
  • @mch:如果它是“x.y.z.w”形式的(这需要 7 个字符,外加一个零)。但这仅允许每个组件使用 1 位数字,这是不现实的场景。
  • @Jongware:除非您将每个部分转换为单个字节(因此它不是人类可读的)。
  • @Abrixas2:我在等别人说这个!不,这会使整个问题过时(使用指针和malloc 来获取可变字符串长度)。如所要求的,存储“形式”是 string 格式。

标签: c arrays string pointers malloc


【解决方案1】:

你不应该这样malloc-

neighbor_address = malloc (1, sizeof (char *));

您在这里没有遵循malloc 的语法。它是calloc 的语法。如果你使用calloc你可以使用这个方法-

neighbor_address = calloc (n, sizeof (char *));

如果你想用malloc试试下面的改动-

neighbor_address = (char **)malloc (n * sizeof (char *));
for(i=0;i<n;i++)
neighbor_address[i] = (char *)malloc (8 * sizeof (char));

但是你在这里使用结构。所以你需要使用箭头运算符为char **neighbor_address;分配内存,因为它是指针类型。试试这个-

neighbors -> neighbor_address = (char **)malloc (n * sizeof (char *)); // n -> no of ip addresses
for(i=0;i<n;i++)
neighbors -> neighbor_address[i] = (char *)malloc (8 * sizeof (char));

【讨论】:

    【解决方案2】:

    哦,我想你不明白 IP 地址的最大长度。 每个点之间可以是 3 位数字,因此最多可以是 255.255.255.255

    所以为它动态分配内存的代码是这样的:

    #define MAX_IP strlen("255.255.255.255")
    int i;
    neighbors my_neighbors;
    my_neighbors.num_neighbors = ?; //Some value that is the num of IP Addresses needed to be stored.
    my_neighbors.neighbor_address = malloc(sizeof(char*)*my_neighbors.num_neighbors); //allocate a char* (that is about to be a string) for each neighbor.
    for(i = 0 ; i < my_neighbors.num_neighbors ; i++)
    {
        my_neighbors.neighbor_address[i] = malloc(sizeof(char)*(MAX_IP+1)); //Allocating enough room in each IP string for 255.255.255.255 + '\0' (null).
    }
    //Doing some stuff.
    //Freeing memory:
    for(i = 0 ; i < my_neighbors.num_neighbors ; i++)
    {
       free(my_neighbors.neighbor_address[i]);
    }
    free(my_neighbors.neighbor_address);
    

    就是这样。 希望你能理解。

    【讨论】:

      【解决方案3】:

      你可以这样分配内存。

      neighbor_address = (char**)malloc(num_neighbors * sizeof(char*));
      for(i=0; i<num_neighbors; ++i) {
          neighbor_address[i] = (char*)malloc(len_of_address);
      }
      

      确保“len_of_address”足够大以存储所有字符(如果您打算存储以 \0 结尾的字符串,则包括终止字符“\0”)。 请注意,如果 IP 地址的每个片段大于 9,则您需要的空间超过 1 个字符。

      因此,要存储 196.168.0.3,您至少需要 12 个字符。

      【讨论】:

        【解决方案4】:

        首先,有两件事:sizeof(char) 是 1,无论实现如何。而且我认为您误解了 malloc 原型。它获取您要分配的字节数,并返回分配的指针。

        如果你想存储x IP,那么你必须这样做:

        neighbor_address = malloc(x * sizeof(char*));
        

        然后如果你想在每个字符串中存储 7 个字符,你必须这样做:

        for (i = 0; i < x; i++)
            neighbor_adress[i] = malloc(7 + 1); // 7 chars plus '\0' character
        

        【讨论】:

          【解决方案5】:

          您必须为num_neighbors char 指针数组分配内存。但最重要的是,请记住# include &lt;stdlib.h&gt;:您使用错误的参数调用了malloc,这可能是导致错误大小之前的段错误的原因。

          使用malloc 最不容易出错的模式是这个:

          neighbor_address = malloc(num_neighbors * sizeof *neighbor_address);
          

          只需将与=的左操作数和sizeof的操作数相同的变量放入,并调整元素个数。

          【讨论】:

            猜你喜欢
            • 2019-01-10
            • 1970-01-01
            • 1970-01-01
            • 2021-12-12
            • 2021-11-22
            • 2021-04-15
            • 1970-01-01
            • 2018-08-11
            • 2016-02-21
            相关资源
            最近更新 更多