该程序编译没有错误,但不执行数组赋值函数C lang

时间:2019-01-20 21:10:42

标签: c

程序编译正常。我使用了gcc -Wall,但没有显示错误。

但是以某种方式在其余的storeFreqDrift之后不执行功能 码。有什么想法吗?也许指针有问题?在代码末尾有文件输入(每个数字在新行中)。我想从函数返回数组值。到目前为止,一切正常,但现在我被困住了。

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

int freqCount;
int calcFreqDrift(const char *file_name, int *result);
int storeFreqDrift(const char *file_name, int tab[freqCount]);

int main() {
    int result = 0;
    freqCount = calcFreqDrift("numbers.txt", &result);
    printf("total number of frequencies is   %d", freqCount);
    int tab[freqCount]; 
    tab[freqCount] = storeFreqDrift("numbers.txt", &tab[freqCount]);
    printf("kolumna nr 3 to %d", tab[3]);
}

int calcFreqDrift(const char *file_name, int *result) {
    FILE *file = fopen("numbers.txt", "r");
    int i = 0;
    int freqCount = 0;  
    if (file == NULL) {
        printf("unable to open file %s", file_name);
    }
    while (fscanf(file, "%d", &i) == 1) {
        freqCount++;
        printf ("%d\n ", i);
        *result += i;
        printf("\n we are at row nr. %d sum of this number and all numbers before is: %d\n", freqCount, *result);
    }
    fclose(file);
    return freqCount; 
}

int storeFreqDrift(const char *file_name, int tab[freqCount]) {
    for (int i = 0; i < freqCount; i++) {
        tab[i] = 5 + tab[i - 1];
    }
    return tab[freqCount];
}

numbers.txt

-14
+15
+9
+19
+18
+14
+14
-18
+15
+4
-18
-20
-2
+17
+16
-7
-3
+5
+1
-5
-11
-1
-6
-20
+1
+1
+4
+18
+5
-20
-10
+18
+5
-4
-5
-18
+9
+6
+1
-19
+13
+10
-22
-11
-14
-17
-10
-1

3 个答案:

答案 0 :(得分:1)

从第10行的main()中调用calcFreqDrift(),但在该函数中,在第32行中关闭(file),然后从第13行的main()中调用具有要打开的文件名的storeFreqDrift(),但是storeFreqDrift()无法打开文件,也不会读取文件。同样在storeFreqDrift()中,第一行读取for(int i = 0; i

答案 1 :(得分:1)

有一些问题,但段错误是由以下行引起的:

tab[freqCount] = storeFreqDrift("numbers.txt", &tab[freqCount]);

注意:

  • &tab[freqCount]是数组后面的内存地址。 C是从零开始的,因此tab数组占用的内存从&tab[0]&tab[freqCount - 1]。通话中使用&tab[freqCount]时,storeFreqDrift将在tab数组之后进入内存。
  • 如注释中所述,当tab[i - 1]为零时,for循环中的tab将取消引用指针i之前的存储位置。 (具有讽刺意味的是,实际上,这是tab中的指针storeFreqDrift实际指向tab中数组main的任何部分的唯一提示。)
  • 由于int tab[freqCount];是在运行时在堆栈上创建的,无论freqCount的值是多少,编译器都无济于事,无法检查馈入storeFreqDrift的内容的一致性。针对函数声明。静态代码分析工具对此事还有很多话要说(例如http://splint.org/)。
  • 同样,由于int tab[freqCount];是在运行时创建的,因此storeFreqDrift函数签名将制表符参数声明为“类型数组”没有任何好处。它将退化为一个int指针。
  • for循环之后:return tab[freqCount];将返回该位置的内存中的任何内容。但是,您的for循环不会填充此位置,而是将值从tab[0]设置为tab[freqCount - 1](其中tabstoreFreqDrift函数中的指针而不是tab中的数组main)。
  • 最后,回到main,您将返回值存储到tab[freqCount]中,这是tab数组之后的存储位置。

将数组传递到c中的函数时,将其视为指针。因此,如果您仅将函数调用为:

,它将更加干净(并且不会出现段错误)。

value = storeFreqDrift("numbers.txt", tab);

答案 2 :(得分:0)

从更改功能参数

int storeFreqDrift(const char *file_name, int tab[freqCount]);

收件人:

int storeFreqDrift(const char *file_name, int tab[]);