C语言循环内存释放疑问及缓冲区未定义行为排查请求
问题解答
核心问题:循环次数不确定时,动态分配内存需要释放吗?
必须释放。不管循环次数是否确定,calloc/malloc/realloc这类动态分配的内存不会自动回收,不释放会造成内存泄漏,长期运行会耗尽系统内存,引发程序或系统异常。
代码中的明显问题排查
你的代码存在多个直接触发未定义行为的问题:
- 数组越界写入:
calloc(30, sizeof(char))分配的是30个char的空间,合法索引范围是0~29,但你执行了buffer[30] = '\0',直接越界修改堆内存的其他区域,会破坏堆结构,导致后续内存操作或printf出现随机异常。 - 字符串未正确终止:循环中仅往buffer存入字符,未及时添加字符串终止符
'\0',使用printf("%s", buffer)时会读取内存中的随机数据,直到遇到某个'\0',这会导致打印内容异常或直接跳过打印。 - 缺失边界检查:即便主机保证字符数不超过30,代码也没有限制
count的最大值,一旦出现异常情况(比如主机发送错误),count超过29时会再次越界写入buffer,破坏内存。 - 未检查内存分配结果:
calloc可能因内存不足分配失败返回NULL,后续直接操作buffer会触发崩溃或异常。
修正后的代码示例
} else if (prompt == 'c') { // check that control signal = c // let host know that 'c' is received printf("BOARD: preparing for coefficient update\n"); // MEMORY ALLOCATION - 分配31个char,预留终止符位置 char *buffer = calloc(31, sizeof(char)); if (buffer == NULL) { printf("BOARD: memory allocation failed\n"); break; // 或添加其他分配失败的处理逻辑 } // check, this should print a blank character printf("buffer init is : %c\n", buffer[0]); int count = 0; prompt = getc(fp); // reads from jtag_uart interface (tested and working) // 限制count不超过29,避免越界 while (prompt != 'x' && count < 30) { buffer[count] = prompt; buffer[count + 1] = '\0'; // 每次存完字符后立即添加终止符 printf("buffer inside loop is : %s\n", buffer); printf("BOARD >> Received: %c\n", prompt); prompt = getc(fp); count++; } free(buffer); buffer = NULL; }
内容的提问来源于stack exchange,提问作者nik
相关产品推荐
相关产品推荐

