Malloc 2D阵列可能的大小溢出

时间:2013-11-27 06:26:54

标签: c malloc

这是我的程序的简化版本。

#include <stdio.h>

int main(void) {

    char **words, **nwords;

    int x;
    words = malloc(sizeof *words * 1000);
    if (words) {
        for (x = 0; x < 20; x++) {
            words[x] = malloc(sizeof *words[x] * 1); 
        }   
    }   

    nwords = malloc(sizeof *nwords * 1000);
    if (nwords) {
        for (x = 0; x < 20; x++) {
            nwords[x] = malloc(sizeof(char) * 200);
            //nwords[x] = "123456789012345"; // works correctly
            nwords[x] = "1234567890123456"; // garbage
        }   
    }   

    int i;
    for (i=0; i<10;i++) {
        sprintf(words[i],"%s",nwords[i]);
    }   

    for (i=0; i<10;i++) {
        printf("\n words[%d] = %s",i,words[i]);
    }   

    return 0;
}

如果nwords [x]中的字符数增加到15以上,则最终printf开始打印奇怪的连接输出。 (见nwords[x] = "1234567890123456"; // garbage行)为什么会这样?我使用malloc为它赋予了200个字符值得记忆。

1 个答案:

答案 0 :(得分:3)

使用此声明

words[x] = malloc(sizeof *words[x] * 1); 

您将单个字符分配给words[x]。然后你做

sprintf(words[i],"%s",nwords[i]);

将多个字符写入words[i]


另外,

nwords[x] = malloc(sizeof(char) * 200);
nwords[x] = "1234567890123456"; // garbage

首先让nwords[x]指向你从堆中分配的内存,然后直接将它指向字符串文字。你可能想要

nwords[x] = malloc(sizeof(char) * 200);
strcpy(nwords[x], "1234567890123456");

nwords[x] = strdup("1234567890123456");