动态二维字符数组

A dynamic 2d char array

我对动态二维字符数组的 C 代码有疑问:malloc 缓冲区溢出。程序思路是初始化一个全局的二维字符数组,当程序在运行时,输入一些单词,将它们保存到那个二维字符数组中。我不熟悉 realloc 函数。这里有什么问题?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
char **array_history;
int count = 0;
#define MAX_LINE_CHARS 1024
int main (void){

    array_history =  malloc(sizeof(char *));
    while (1) {
        char line[MAX_LINE_CHARS];
        if (fgets(line, MAX_LINE_CHARS, stdin) == NULL)
            break;

        array_history = realloc(array_history, sizeof(char*)*(count + 1));
        int len_size = strlen(line) + 1;

        array_history[count] = malloc(len_size*sizeof(char));
        for (int i = 0; line[i] != '[=10=]'; i++) {
            array_history[count][i] = line[i];
            // printf("%c", line[i]);
        }
        // printf("%s", array_history[0]);
        // for (int i = 0; history[i] != NULL; i++) {
        //     printf("%s\n", history[i]);
        // }
        count++;
    }

    for (int i = 0; array_history[i] != NULL; i++) {
        printf("%s", array_history[i]);
    }

    return 0;
}

您的代码中有一些错误。 您未能终止您的字符串,也未能添加您在打印字符串时使用的标记值。

固定版本可能如下所示: (您应该为 malloc 等添加更多错误检查)

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

#define MAX_LINE_CHARS 1024

int main (void){

    char **array_history;
    int count = 0;
    array_history = malloc(sizeof(char *)*(count+1));
    // TODO: Check for NULL
    array_history[0] = NULL;  // Terminate the array.

    while (1) {
        char line[MAX_LINE_CHARS];
        if (fgets(line, MAX_LINE_CHARS, stdin) == NULL)
            break;

        void *temp_ptr = realloc(array_history, sizeof(char*)*(count + 2));
        // TODO: Check for NULL
        array_history = temp_ptr;

        int len_size = strlen(line) + 1;
        array_history[count] = malloc(len_size*sizeof(char));
        array_history[count + 1] = NULL;  // Add sentinel for your array

        int i;
        for (i = 0; line[i] != '[=10=]'; i++) {
            array_history[count][i] = line[i];
            // printf("%c", line[i]);
        }
        array_history[count][i]=0; // Terminate the new string.
        // Or simply use strcpy(array_history[count],line);
        
        // printf("%s", array_history[0]);
        // for (int i = 0; history[i] != NULL; i++) {
        //     printf("%s\n", history[i]);
        // }
        count++;
    }

    // Instead of terminating NULL value you could just use condition `i<count`
    for (int i = 0; array_history[i] != NULL; i++) {
        printf("%s", array_history[i]);
    }

    return 0;
}