如何创建一个可以存储超过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
个字符串的方法。
答案 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
缓冲区。在运行此时,您将耗尽堆栈空间,这可能会导致段错误。