我正在学习C,我想知道为什么下面的代码没有崩溃,我只是在使用Valgrind时发现了这个问题。
void push(char *element){
FILE *file = fopen("stack.db", "w");
int rc = fwrite(element, sizeof(element), 1, file);
if (file) fclose(file);
}
void top() {
char *top_element = malloc(sizeof(char));
FILE *file = fopen("stack.db", "r+");
int rc = fread(top_element, sizeof(char), 1, file);
printf("Top element: %s", top_element);
}
int main(int argc, char *argv[]) {
char action = argv[1][0];
switch (action) {
case 'p':
printf("pushing element to stackn");
push(argv[2]);
break;
case 't':
top();
break;
default:
printf("dien");
}
return 0;
}
首先,我调用push()
并将argv[2]
写入该文件。然后我呼叫top()
;我从malloc中获得一块内存,大小为char,并将其分配给top_element。然而,这应该是char*的大小,所以我实际上是在调用malloc(1)
,而我本应该调用malloc(8)
。这个代码有效,我只是在使用Valgrind时才发现错误。
我的问题是,当我分配给top_element
的内存太小时,它是如何工作的?
否,应该是sizeof(char)
。你想要一段足够长的内存来存储一个字符;malloc(sizeof(char))
返回一个指针。则CCD_ 9将返回指向足以存储CCD_。您可以将malloc(T * n)
视为将T*
返回给n
T
s。
我怀疑Valgrind在抱怨printf
将读取超出由char* top_element
表示的字符串的末尾,因为它不是零终止的。如果你想从文件中读取一个n
字节的字符串,你确实需要n + 1
字节的内存,因为你需要考虑应该放在末尾的