这是我的代码:
#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
有人可以指导我并显示我的代码有什么问题吗?
答案 0 :(得分:3)
行
keywords = malloc(5);
values = malloc(5);
给你5个字节的内存。我认为你想要5个元素数组。这些将被分配为
keywords = malloc(5 * sizeof(*keywords));
values = malloc(5 * sizeof(*values));
目前,您的写作超出了为keywords
和values
分配的内存的末尾。这种效果是未定义的(如此不可预测),但听起来超出一个数组末尾的写入会破坏另一个数组使用的内存。