使用while(fgets)语句后,为什么我的c指针地址会发生变化?

时间:2014-02-10 15:19:04

标签: c pointers math segmentation-fault fgets

数字地址变为高值然后给我一个seg-fault。我傻眼了为什么会这样,因为我没有做任何指针数学直到while-fgets语句。该程序应该通过三个未排序的整数文件并将它们放在一个数组中。然后对数组进行冒泡排序,然后输出到其他文本文件。它适用于计算机科学课程。我以为我通过阅读Franek的内存书为本课做好了准备,但我无法解释为什么在创建fgets语句后数组的地址随机改变。

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#define DEBUG 1
#define TRUE 1
#define FALSE 0
#define INCREMENT_MEM 128
#define MAX_LENGTH 8
#define INIT_SIZE 8
#define NUMBER_OF_TEXT_FILES 3

int* resize(int*, int*);
void myswap(int *, int*);

int main(){
FILE *fp;
int init_size = INIT_SIZE;
int *maxsize = &init_size;
int total_newlines = -1;
int* numbers;
char str[] = "";
char file[] = "list0.txt";
int array_is_ordered = TRUE;
int i, j;
    numbers = (int*) malloc (INIT_SIZE * sizeof(int) );
    for(i = 0; i < NUMBER_OF_TEXT_FILES; i++){
        file[4] = (char)((int)'0' + i);
        fp = fopen(file , "r" );
        while( fgets( str, MAX_LENGTH, fp ) != NULL){
        total_newlines++;
            if(total_newlines>= *maxsize){
                numbers = resize(numbers, maxsize);
            }
                                                                    #if DEBUG == 1
                                                                    printf("total_newlines=%d str=%s numbers=%d *number=%d",total_newlines, str, (int)numbers, *numbers );
                                                                    #endif
            *(numbers + total_newlines) = atoi(str);

        }
    fclose(fp);
    }

    int temp_int = total_newlines - INCREMENT_MEM;
    numbers = resize(numbers, &temp_int);
    total_newlines = temp_int;

    /*
    BUBBLE SORT!!!!!!!!!!!!! LULZ
    */
    do{ 
        for(i = 1; i < total_newlines; i++){
            array_is_ordered = TRUE;
            if( *(numbers+i-1) > *(numbers+i)){
                array_is_ordered = FALSE;
                myswap( &(*(numbers+i-1)) , &(*(numbers+i)) );
            }
        }
    } while(array_is_ordered==FALSE);

    /*write output code using fprintf. don't forget to close all files and free all standing memory.*/

    FILE *of;
    of = fopen("output.txt", "w");
    printf("Opening output file for sorted digits\n");
    for(i = 0 ; i < total_newlines ; i++){
        fprintf(of, "%d\n", *(numbers+i));
        printf("%d\n", *(numbers+1) );
    }

    fclose(of);
    fclose(fp);
    free(numbers);

return 0;
}

void myswap(int *a, int *b){
int temp = *a;
    *a = *b;
    *b = temp; 
}
int* resize(int* array , int* size){
int *temp;
    *size = *size + INCREMENT_MEM;
    temp = (int *) realloc ( array, (*size) * sizeof(int) );
    if(temp!=NULL){
        array = temp;
    }else{
        printf("Resize to %d did not work", *size);
        exit(0);
    }
return array;
}

1 个答案:

答案 0 :(得分:1)

更改

char str[] = "";

char str[MAX_LENGTH+2];

或类似的。您的代码读入缓冲区 str ,但 str 没有分配内存。所以 fgets 会覆盖堆栈上的一些数据,包括你的数字指针。

+2,因为我假设您的数字长达_MAX_LENGTH_长,并且还应该有足够的空间用于\ n和零终止符。