动态数组中的垃圾值

时间:2016-02-28 01:55:16

标签: c arrays memory dynamic

有人可以帮我解释为什么我的数组中会出现垃圾值吗?我的代码是:

FILE *fp;
fp = fopen("input.txt", "r");

char buffer[5000];
int size = 0;
char *ptr;
char **fileArrayPTR;

fileArrayPTR = malloc(sizeof(char*));

while (fgets(buffer, 5001, fp) != NULL) {
    fileArrayPTR[size] = malloc(strlen(buffer) + 1);
    strcpy(fileArrayPTR[size], buffer);
    for (int p = 0; p < 5001; p++) {
        if (fileArrayPTR[size][p] == '\n') {
            fileArrayPTR[size][p] = '\0';
            break;
        }
    }
    //printf("%s\n",fileArrayPTR[size]);
    size++;
}
for (int x = 0; x < size; x++) {
    printf("%s\n", fileArrayPTR[x]);
}

如果我取消注释size++前面的printf语句,我会得到正确的结果,但是当我把它拿出来并尝试代码的底部时它不起作用。它适用于fileArrayPTR[16]或更高,但不适用于0-15。另外,如果我要将fileArrayPTR返回main,我怎么能同时返回大小呢?

1 个答案:

答案 0 :(得分:0)

您应该重新分配字符串数组,以便在读取更多行时将其增长:

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

char **getlines(int *sizep) {
    FILE *fp;
    char buffer[5001];
    int size = 0;
    char **fileArrayPTR = NULL;

    fp = fopen("input.txt", "r");
    if (fp == NULL) {
        *sizep = -1;
        return NULL;
    }

    while (fgets(buffer, 5001, fp) != NULL) {
        fileArrayPTR = realloc(fileArrayPTR, sizeof(*fileArrayPTR) * (size + 1));
        fileArrayPTR[size] = strdup(buffer);
        for (int p = 0; p < 5001; p++) {
            if (fileArrayPTR[size][p] == '\n') {    
                fileArrayPTR[size][p] = '\0';
                break;
            }
        }
        //printf("%s\n", fileArrayPTR[size]);
        size++;
    }
    *sizep = size;
    return fileArrayPTR;
}

int main(void) {
    int size;
    char **array = getlines(&size);
    for (int x = 0; x < size; x++) {
        printf("%s\n", array[x]);
    }
    return 0;
}

请注意,buffer应定义为5001,以便与其余代码保持一致。

您可以通过设置传递指针的变量将size返回到main,如上所示。