0

这是我的代码:


 #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 。

任何人都可以指导我并说明我的代码有什么问题吗?

4

1 回答 1

3

线条

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

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

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

目前,您正在写入超出为keywords 和分配的内存的末尾values。这样做的影响是未定义的(因此无法预测),但听起来超出一个数组末尾的写入正在破坏另一个数组使用的内存。

于 2013-02-22T13:27:56.483 回答