0

テキストファイルを読み書きするためのコードを書いています。しかし、コードを実行すると、SIGSEGVランタイムエラーが発生します。コードの何が問題なのかを理解するのに助けが必要です。

#include <stdio.h>
#include <stdlib.h>
int main(){
    /*Variable for writing to file */
    char *name[] = {"Raju", "Nayan", "Hanif"};
    char *id[] = {"100", "101", "102"};
    float cgpa[] = {3.50, 5.00, 4.00};
    /*Variable for reading from file*/
    char *getname, *getid;
    float getcgpa;
    int i;
    FILE *fp;
    fp = fopen("f:\\raju.nog", "w"); /*Create new file */
    for(i=0; i<5; i++){
        fprintf(fp, "%-10s%-10s%-1.2f\n", name[i], id[i], cgpa[i]); /*write to file*/
    }
    fclose(fp);
    /*read from file and print to screen*/
    fp = fopen("f:\\raju.nog", "r");
    while(fscanf(fp, "%s %s %f", &getname, &getid, &getcgpa) != EOF){
        printf("%-10s%-10s%-1.2f\n", getname, getid, getcgpa);
    }

    system("PAUSE");
}
4

5 に答える 5

7

配列:

char *name[] = {"Raju", "Nayan", "Hanif"};
char *id[] = {"100", "101", "102"};
float cgpa[] = {3.50, 5.00, 4.00};

3つの要素を宣言しますが

for(i=0; i<5; i++){
    fprintf(fp, "%-10s%-10s%-1.2f\n", name[i], id[i], cgpa[i]); /*write to file*/
}

は5を超えて反復しようとしているため、配列の境界を超えています。

于 2012-09-14T15:21:30.253 に答える
5

コードにはいくつかの問題があります。

  • 各変数の5つの要素をファイルに書き込んでいますが、各変数には3つの要素しかないため、バッファオーバーフローが発生します。
  • getname、getid変数は単なるポインターであり、それらのストレージはありません

これらのエラーを見つけるには、デバッガーを使用してステップスルーできる必要があります。

動作するコードは次のとおりです。

#include <stdio.h>
#include <stdlib.h>
int main(){
    /*Variable for writing to file */
    char *name[] = {"Raju", "Nayan", "Hanif"};
    char *id[] = {"100", "101", "102"};
    float cgpa[] = {3.50, 5.00, 4.00};
    /*Variable for reading from file*/

    // need storage space
    char getname[40], getid[40];
    float getcgpa;
    int i;
    FILE *fp;
    fp = fopen("raju.nog", "w"); /*Create new file */

    // Only 3 elements
    for(i=0; i<3; i++){
        fprintf(fp, "%-10s%-10s%-1.2f\n", name[i], id[i], cgpa[i]); /*write to file*/
    }
    fclose(fp);
    /*read from file and print to screen*/
    fp = fopen("raju.nog", "r");
    while(fscanf(fp, "%s %s %f", &getname, &getid, &getcgpa) != EOF){
        printf("%-10s%-10s%-1.2f\n", getname, getid, getcgpa);
    }
    return(0);
}

gdbにアクセスできる場合は、最初の問題を見つけ、次に2番目の問題を見つけることができます。これは、コードで最初のエラーを引き起こしている行を指摘している私のGDBセッションのログです。

(gdb) run
Starting program: /home/jrn/SO/a.out 

Program received signal SIGSEGV, Segmentation fault.
0x005cc35e in vfprintf () from /lib/libc.so.6
(gdb) bt
#0  0x005cc35e in vfprintf () from /lib/libc.so.6
#1  0x005d33cf in fprintf () from /lib/libc.so.6
#2  0x08048565 in main () at sowrong.c:15
(gdb) list
1   #include <stdio.h>
2   #include <stdlib.h>
3   int main(){
4       /*Variable for writing to file */
5       char *name[] = {"Raju", "Nayan", "Hanif"};
6       char *id[] = {"100", "101", "102"};
7       float cgpa[] = {3.50, 5.00, 4.00};
8       /*Variable for reading from file*/
9       char *getname, *getid;
10      float getcgpa;
(gdb) list
11      int i;
12      FILE *fp;
13      fp = fopen("f:\\raju.nog", "w"); /*Create new file */
14      for(i=0; i<5; i++){
15          fprintf(fp, "%-10s%-10s%-1.2f\n", name[i], id[i], cgpa[i]); /*write to file*/
16      }
17      fclose(fp);
18      /*read from file and print to screen*/
19      fp = fopen("f:\\raju.nog", "r");
20      while(fscanf(fp, "%s %s %f", &getname, &getid, &getcgpa) != EOF){
(gdb) list
21          printf("%-10s%-10s%-1.2f\n", getname, getid, getcgpa);
22      }
23  }

次の行に注意して#2 0x08048565 in main () at sowrong.c:15
ください。これは、15行目でセグメンテーション違反が発生したことを示しています。その後、ファイルを一覧表示して行を確認できます。

したがって、15行目を修正した後、プログラムを再度コンパイルし、GDBを介して実行して、2番目の問題を見つけます。これが私のGDBセッションのログです:

(gdb) run
Starting program: /home/jrn/SO/a.out 

Program received signal SIGSEGV, Segmentation fault.
0x005cc35e in vfprintf () from /lib/libc.so.6
(gdb) bt
#0  0x005cc35e in vfprintf () from /lib/libc.so.6
#1  0x005d3410 in printf () from /lib/libc.so.6
#2  0x080485be in main () at sowrong.c:21
(gdb) list
1   #include <stdio.h>
2   #include <stdlib.h>
3   int main(){
4       /*Variable for writing to file */
5       char *name[] = {"Raju", "Nayan", "Hanif"};
6       char *id[] = {"100", "101", "102"};
7       float cgpa[] = {3.50, 5.00, 4.00};
8       /*Variable for reading from file*/
9       char *getname, *getid;
10      float getcgpa;
(gdb) list
11      int i;
12      FILE *fp;
13      fp = fopen("f:\\raju.nog", "w"); /*Create new file */
14      for(i=0; i<3; i++){
15          fprintf(fp, "%-10s%-10s%-1.2f\n", name[i], id[i], cgpa[i]); /*write to file*/
16      }
17      fclose(fp);
18      /*read from file and print to screen*/
19      fp = fopen("f:\\raju.nog", "r");
20      while(fscanf(fp, "%s %s %f", &getname, &getid, &getcgpa) != EOF){
(gdb) list
21          printf("%-10s%-10s%-1.2f\n", getname, getid, getcgpa);
22      }
23  }

もう一度、次の行に注意して#2 0x080485be in main () at sowrong.c:21
ください。2番目のSEGFAULT。変数は単なるポインターであり、ストレージスペースがないためです。

于 2012-09-14T16:22:17.453 に答える
3

あなたはのためのmallocメモリを持っていません

 char *getname, *getid;
于 2012-09-14T15:21:10.380 に答える
3

char *getname, *getid;文字列を格納するためのメモリではなく、ポインタのみを割り当てます。次のようなものが必要です。

char getname[11];
char getid[11]; 

私はあなたのステートメントからサイズを推測しましたprintfが、おそらくそれらよりも大きな配列が必要です。

于 2012-09-14T15:21:14.497 に答える
2

forループカウンターは0から4になりますが、配列nameidあり、cgpa要素は3つしかないため、配列の境界を超えています。

于 2012-09-14T15:22:49.623 に答える