gpt4 book ai didi

c - Valgrind 警告写入和读取错误

转载 作者:太空宇宙 更新时间:2023-11-04 08:53:44 24 4
gpt4 key购买 nike

我在使用 valgrind 时遇到写/读问题,我不明白为什么。错误始终发生在同一代码块上,仅更改内存地址。代码块是:

void stringModifier(char *string) {
char *sourceString = string;
char *destinyString = sourceString;

while(*string != '\0') {
*string = tolower(*string);

if(*string != ' ') { *destinyString++ = *string; }

string++;
}

*destinyString = '\0';
}

int qsortComparison(const void *a, const void *b) {
return (*(char *)a - *(char *)b);
}

void qsortString(char *string, char *tempString) {
strcpy(tempString, string);
stringModifier(tempString);
qsort(tempString, strlen(tempString), sizeof(char), qsortComparison);
}

void outputReader(char *string1, char *string2) {
char *tempString1 = (char *) malloc (strlen(string1) * sizeof(char));
char *tempString2 = (char *) malloc (strlen(string2) * sizeof(char));

qsortString(string1, tempString1);
qsortString(string2, tempString2);

if(!strcmp(tempString1, tempString2)) { printf("V\n", string1, string2); }
else { printf("F\n"); }
}

每次我使用 outputReader 并调用 qsortString 时,valgrind 都会在 strcpy 处警告一个write 错误 然后在 stringModifier 警告 read 错误,发生在相同的内存地址上。

最佳答案

遵循相关调用之一的路径。

  1. char *tempString1 = (char *) malloc (strlen(string1) * sizeof(char)); :这会分配一个字符串缓冲区,它是 中的字符数string1 不包括 0-终止符,如果要存储字符串的完整副本,则需要终止符的空间,但你不分配它。

  2. qsortString(string1, tempString1); :现在我们将源字符串缓冲区 新分配的 one-char-too-short 缓冲区传递给它功能。

  3. qsortString() 中,您然后 strcpy(tempString, string); :这将向内存中写入一个额外的字符(终止符)拥有。因此,这是未定义的行为

Valrind 是对的。你正在写(然后读)你不拥有的内存。分配应包括用于 0 终止符的空间。例如: malloc ((strlen(string1)+1) * sizeof(char)); 另一种选择是使用 strdup(),尽管它不是 C 标准的一部分。 ,它将为您正确处理分配 复制。你如何选择我留给你的解决方案。

旁注:Don't cast malloc() return values in C

关于c - Valgrind 警告写入和读取错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18465683/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com