【问题标题】:Array of pointers - need bigger指针数组 - 需要更大
【发布时间】:2016-11-17 13:16:22
【问题描述】:

如何创建一个可以存储多个1,047,141 指针的指针数组?我使用以下代码计算了这个数字:

int main(int argc, char const *argv[]) {
  long a = 0;
  while(1==1){
    char * str[a];
    printf("%ld is good.\n", a);
    a++;
    //Loop ends on Segmentation fault
  }

  return 0;
}

我正在使用指针数组来存储字符串。有哪些替代方案?

编辑

上面的代码只是查找指针数组的最大大小的一种方法。

一个指针保存一个字符串,所以我可以存储的最大字符串数是1,047,141。我需要一种存储多个1,047,141 字符串的方法。

【问题讨论】:

标签: c arrays string pointers malloc


【解决方案1】:

通过malloc()动态分配数组。

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

int main(int argc, char const *argv[]) {
  long a = 0;
  while(1==1){
    char ** str = malloc(sizeof(char*) * a);
    if (str != NULL){
      printf("%ld is good.\n", a);
      free(str);
    } else {
      break;
    }
    a++;
  }

  return 0;
}

【讨论】:

  • 我还需要能够访问以前存储的字符串。
  • 指针数组中的每个指针都分配了一个字符串,我需要以后能够访问每个指针。
  • @sudoman “稍后”是什么时候?您将在哪里分配字符串以及在哪里使用它们?编写代码来做你想做的事。如果您不知道该怎么做,请提出问题,而不仅仅是说出您想做什么。
  • @MikeCAT 我问题中的代码只是一种找出指针数组最大大小的方法。我想要的是一种在指针数组中存储超过最大数量的指针(将用于存储字符串)的方法。如果那不可能,那么另一种存储超过1,047,141 字符串的方式。
  • @sudoman 磁盘上的文件通常用于存储太大而无法存储在(主)内存中的数据。
【解决方案2】:

您必须使用 malloc 在堆上分配数组。此代码将分配一个长指针数组how_many_strings;并且对于每个指针,它将分配一个长字符串str_length

char** str = malloc(sizeof(char*)*how_many_strings);
for(int i = 0; i < how_many_strings; i++)
{
    str[i] = malloc(sizeof(char)*str_length);
}

大小受限于您​​的 RAM 容量。

【讨论】:

    【解决方案3】:

    OP 代码具有未定义的行为。该数组没有被使用,所以如果你使用 -O2 (gcc),你只是打印a,因为它增加了。 Gcc 生成:

    .L2:
        movq    %rbx, %rdx
        movl    $.LC0, %esi
        movl    $1, %edi
        xorl    %eax, %eax
        addq    $1, %rbx
        call    __printf_chk
        jmp .L2
    

    它不会出现段错误,但输出会很无聊。

    但是,使用 -O0,gcc 会生成一个更长的循环(我不想粘贴),它会在堆栈上创建越来越大的 str 缓冲区。在运行它的某个时候,您会用完堆栈空间,这可能会导致段错误。

    【讨论】:

    • OP 代码的哪一部分引发了“未定义的行为”,请问如何处理?
    • 每次通过循环缓冲区可能会增长(在 gcc 上使用 -O0)。最终这会导致堆栈溢出。
    • Ahok,当然,我明白你指的是在 SO 发人深省的 UB 之上的其他东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2014-01-26
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    相关资源
    最近更新 更多