realloc()
和 strtok()
是C语言标准库中的两个函数,它们分别用于动态内存管理和字符串分割。当在使用 strtok()
函数时遇到“下一个大小无效”的错误,通常与 realloc()
的使用不当有关。
realloc():
realloc()
用于调整已分配内存块的大小。malloc()
、calloc()
或 realloc()
分配的内存)和一个新的大小值。realloc()
返回指向新分配内存的指针,且原有内存的内容会被保留。NULL
,且原有内存保持不变。strtok():
strtok()
用于将字符串分割成一系列标记(tokens)。strtok()
修改原字符串,将分隔符替换为 \0
(空字符)。原因:
realloc()
调整内存大小后,可能访问了未初始化或超出新分配内存范围的数据。realloc()
可能会移动内存块,如果保存了原始指针并在之后使用它,就会导致未定义行为。strtok()
的多次初始化(即多次调用 strtok(NULL, delimiter)
之前没有正确地处理返回值)可能导致逻辑错误。解决方案:
realloc()
的返回值是否为 NULL
,并在失败时采取适当的措施。realloc()
成功且返回了新地址,确保更新所有指向该内存块的指针。strtok()
: 确保在循环中正确使用 strtok()
,并在每次迭代后更新指针。#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char *str = strdup("Hello,World,this,is,a,test");
if (!str) {
perror("strdup");
return 1;
}
char *token;
char *saveptr;
size_t total_length = strlen(str);
char *buffer = malloc(total_length + 1);
if (!buffer) {
perror("malloc");
free(str);
return 1;
}
strcpy(buffer, str);
for (token = strtok_r(buffer, " ", &saveptr); token != NULL; token = strtok_r(NULL, " ", &saveptr)) {
printf("%s\n", token);
}
free(buffer);
free(str);
return 0;
}
realloc()
时,最好将返回的新指针赋值给一个临时变量,以避免在 realloc()
失败时丢失原始指针。strtok_r()
是 strtok()
的线程安全版本,它接受一个额外的参数来保存状态。通过遵循上述建议和示例代码,可以避免在使用 realloc()
和 strtok()
时遇到“下一个大小无效”的问题。
领取专属 10元无门槛券
手把手带您无忧上云