C 指针数组-需要更大的

C 指针数组-需要更大的,c,arrays,string,pointers,malloc,C,Arrays,String,Pointers,Malloc,如何创建一个指针数组来存储超过1047141个指针?我使用以下代码计算了这个数字: 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; } 我使用指针数组来存储字符串。有哪些替代

如何创建一个指针数组来存储超过1047141个指针?我使用以下代码计算了这个数字:

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;
}
我使用指针数组来存储字符串。有哪些替代方案

编辑

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


一个指针包含一个字符串,因此我可以存储的最大字符串数为
1047141
。我需要一种存储超过
1047141
字符串的方法。

通过
malloc()
动态分配数组

#包括
#包括
int main(int argc,char const*argv[]{
长a=0;
而(1==1){
char**str=malloc(sizeof(char*)*a);
如果(str!=NULL){
printf(“%ld良好。\n”,a);
自由基(str);
}否则{
打破
}
a++;
}
返回0;
}

通过
malloc()
动态分配阵列

#包括
#包括
int main(int argc,char const*argv[]{
长a=0;
而(1==1){
char**str=malloc(sizeof(char*)*a);
如果(str!=NULL){
printf(“%ld良好。\n”,a);
自由基(str);
}否则{
打破
}
a++;
}
返回0;
}

您必须使用malloc在堆上分配数组。此代码将分配一个长
多少字符串的指针数组
;对于每个指针,它将分配一个长字符串
stru 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);
}
char**str=malloc(sizeof(char*)*有多少个字符串);
for(int i=0;i<有多少个字符串;i++)
{
str[i]=malloc(sizeof(char)*str_长度);
}

大小受限于RAM容量。

您必须使用malloc在堆上分配阵列。此代码将分配一个长
多少字符串的指针数组
;对于每个指针,它将分配一个长字符串
stru 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);
}
char**str=malloc(sizeof(char*)*有多少个字符串);
for(int i=0;i<有多少个字符串;i++)
{
str[i]=malloc(sizeof(char)*str_长度);
}

大小仅限于RAM容量。

操作代码具有未定义的行为。数组没有被使用,因此如果使用-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
缓冲区。在运行此命令时,可能会耗尽堆栈空间,从而导致segfault

操作代码具有未定义的行为。数组没有被使用,因此如果使用-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
缓冲区。在运行此命令时,可能会耗尽堆栈空间,从而导致segfault

自动变量的可能重复项在堆栈上分配。自动变量的可能重复项在堆栈上分配。我还需要能够访问以前存储的字符串。指针数组中的每个指针都分配了一个字符串,我需要能够在以后访问每一个。@sudoman何时为“以后”?您将在哪里分配字符串以及在哪里使用它们?编写代码来做你想做的事情。如果你不知道怎么做,请提问,而不仅仅是告诉你想做什么。@MikeCAT我问题中的代码只是一种找出指针数组最大大小的方法。我想要的是在指针数组中存储超过最大数量的指针(用于存储字符串)。如果这不可能,那么另一种存储超过
1047141
字符串的方法。@磁盘上的sudoman文件通常用于存储太大而无法存储在(主)内存中的数据。我还需要能够访问以前存储的字符串。指针数组中的每个指针都分配了一个字符串,我需要能够在以后访问每个文件。@sudoman“以后”是什么时候?您将在哪里分配字符串以及在哪里使用它们?编写代码来做你想做的事情。如果你不知道怎么做,请提问,而不仅仅是告诉你想做什么。@MikeCAT我问题中的代码只是一种找出指针数组最大大小的方法。我想要的是在指针数组中存储超过最大数量的指针(用于存储字符串)。如果这是不可能的,那么另一种存储超过
1047141
字符串的方法。@sudoman磁盘上的文件通常用于存储太大而无法存储在(主)内存中的数据。OP代码的哪一部分会引发“未定义行为”,以及如何引发?每次通过循环,缓冲区都可能增长(gcc上有-O0)。最终这会导致堆栈溢出。啊,当然,我知道你指的是在如此惹人发火的UB之上的其他东西。OP代码的哪一部分会引发“未定义的行为”,以及如何引发?每次通过循环,缓冲区都可能增长(gcc上有-O0)。最终这会导致堆栈溢出。啊,当然,我知道你们指的是在如此惹人生气的UB之上的其他东西。