c中的char数组问题

时间:2013-02-22 13:18:47

标签: c memory-management

这是我的代码:


 #include        
 #include        

 int main(int argc, char *argv[]) {

        const char **keywords;
        const char **values;
        char line[50];
        char *prop, *val, *tmp;
        int i = 0, j = 0;
        FILE *creds = fopen("/path/to/file.props", "r");

        keywords = malloc(5);
        values = malloc(5);

        while (fgets(line, LINE_SIZE, creds) != NULL) {
                if (line[strlen(line) - 1] == '\n')
                        line[strlen(line) - 1] = '\0';
                prop = line; 
                while(*(prop++) != '=') {
                        i++;
                }       
                tmp = prop;
                prop = malloc(i + 1);
                strncpy(prop, line, i);
                prop[i] = '\0';
                keywords[j] = prop;
                val = malloc(strlen(line) - strlen(prop));
                strcpy(val, tmp);
                values[j++] = val;
                i = 0;
        }
printf("%s %s %s %s %s\n", keywords[0], keywords[1], keywords[2], keywords[3], keywords[4]);
}

                                                                                                                         

现在,file.props有内容:


hostaddr=127.0.0.1
port=5432
user=username
password=mypass
dbname=my_db_name

当我运行程序时,我得到了:

  

@raddr端口用户密码dbname

如果我使用values[j++] = val对该行进行评论并正确增加j,那么输出应该是这样的:

  

hostaddr端口用户密码dbname   

有人可以指导我并显示我的代码有什么问题吗?

1 个答案:

答案 0 :(得分:3)

keywords = malloc(5);
values = malloc(5);

给你5个字节的内存。我认为你想要5个元素数组。这些将被分配为

keywords = malloc(5 * sizeof(*keywords));
values = malloc(5 * sizeof(*values));

目前,您的写作超出了为keywordsvalues分配的内存的末尾。这种效果是未定义的(如此不可预测),但听起来超出一个数组末尾的写入会破坏另一个数组使用的内存。