簡體   English   中英

使用文件中的字符串數組進行分段錯誤

[英]segmentation fault with array of string from file

我想我會理解字符串是如何工作的,但有些人在嘗試運行時會遇到分段錯誤。 我正在嘗試創建從文件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]);
}

看看這是否有幫助

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)。

有一個數組分配的限制,大小你正在嘗試導致函數堆棧溢出 ,因為你的數組不能適應分配給函數堆棧的內存。

由於內部編譯器實現限制,對象的最大大小限制為8MB 您應該使用malloc()來創建大型數組。

我認為沒有必要創建str變量,你可以使用a本身。 此外,如評論中所述,嘗試使用動態內存,因為大多數程序員不使用堆棧進行大量分配。 可能堆可能比堆棧更大。

在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;
}

你可以試試這個。

#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);

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM