指针数组 - 需要更大

时间:2016-07-14 14:45:19

标签: c arrays string pointers malloc

如何创建一个可以存储超过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个字符串的方法。

3 个答案:

答案 0 :(得分:4)

通过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;
}

答案 1 :(得分: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容量。

答案 2 :(得分:0)

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缓冲区。在运行此时,您将耗尽堆栈空间,这可能会导致段错误。