使用文件中的字符串数组进行分段错误

时间:2016-05-13 05:41:53

标签: c

我想我理解字符串是如何工作的,但有些人在尝试运行时会遇到分段错误。我正在尝试创建从文件f中读取的字符串数组。此外,任何评论优化和/或更好的代码方式(特别是使用指针)是值得赞赏的。

char a[700000][120];
char str[120];
int i=0,l,p;
while (fgets(str,120,f)) {
    strcpy(a[i],str);
    i++;
    }
int n=i;
for (i=0;i<=3;i++) {
    printf("%s\n",a[i]);
}

5 个答案:

答案 0 :(得分:2)

看看这是否有帮助

char **a;
int i;

a = malloc(700000 * sizeof(char*));
for (i = 0; i < 700000; i++) {
    a[i] = malloc(120*sizeof(char));
}

// read file here instead
strcpy(a[0],"hello");
strcpy(a[1],"goodbye");
strcpy(a[2],"yes");

for (i=0;i<=3;i++) {
    printf("%s\n",a[i]);
}

Per Michi,记得事后释放记忆。

for (i = 0; i < 700000; i++) {
    free(a[i]);
}
free(a);

附录原来可以检查堆栈大小并进行更改。考虑一下这个

struct rlimit rl;
int result;

result = getrlimit(RLIMIT_STACK, &rl);

printf("stack limit %d\n", rl.rlim_cur);
printf("stack limit %d\n", rl.rlim_max);
return 0;

它给了我

stack limit 8388608
stack limit -1

(有8MB)。

答案 1 :(得分:2)

有一个数组分配的限制,你正在尝试的大小导致函数的堆栈溢出,因为你的数组不能适应分配给函数堆栈的内存

由于内部编译器实现限制,对象的最大大小存在 8MB 的限制。 您应该使用 malloc()来创建大型数组。

答案 2 :(得分:0)

我认为不需要创建 str 变量,您可以使用 a 本身。此外,如评论中所述,尝试使用动态内存,因为大多数程序员不使用堆栈进行大量分配。可能堆可能比堆栈更大。

答案 3 :(得分:0)

在Linux环境中,ulimit -s可以返回堆栈大小。

root@ubuntu:# ulimit -s
8192

这意味着系统支持的最大堆栈空间 8192 KB ,即 8MB 。测试程序如下,尝试将数组大小从8 * 1024修改为7 * 1024。

#include<stdio.h>

void test()
{
}

int main()
{
    char a[7*1024][1024];
    test();
    return 0;
}

答案 4 :(得分:0)

你可以试试这个。

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

void main(void) {

    FILE *fp = NULL;
    fp = fopen("read.txt", "rb");
    if(fp == NULL)
        printf("failure\n");
    else
        printf("success\n");

    char buffer[4096];
    while (fgets(buffer, sizeof(buffer), fp) != 0)
        fputs(buffer, stderr);

}