C语言函数返回解引用指针值时出现Runtime error求助
问题分析与修复方案
问题根源
get()函数中的void *ptr是未初始化的野指针,scanf需要接收指向有效内存区域的指针来存储输入值,但这里ptr指向随机内存地址,写入操作直接触发内存访问错误(即你看到的The memory could not be written)。getInt()里的打印看似正常,只是未定义行为下的偶然巧合——非法内存访问不一定会立刻崩溃,后续的函数返回、栈操作才让错误暴露出来。- 代码还存在笔误:
prinf应为printf,这会导致编译或运行异常。
修复方案
方案1:让get()动态分配内存(需手动释放)
通过malloc为输入值分配有效内存,使用后释放避免内存泄漏:
#include <stdlib.h> void * get(char formatSpecifier[]){ // 这里以int为例,若要支持其他类型需扩展格式符判断逻辑 void *ptr = malloc(sizeof(int)); if (ptr == NULL) { // 处理内存分配失败场景 return NULL; } scanf(formatSpecifier, ptr); return ptr; } int getInt(){ int *intPtr = (int *)get("%d"); if (intPtr == NULL) { return -1; // 内存分配失败时返回默认值 } int i = *intPtr; printf("Works perfectly fine here: %d\n", i); free(intPtr); // 释放动态分配的内存 return i; } int main(){ int j = getInt(); printf("The value is : %d\n", j); return 0; }
方案2:由调用者传入内存地址(更安全)
调整get()的设计,让调用者提供存储输入的内存地址,无需动态分配:
void get(char formatSpecifier[], void *dest){ scanf(formatSpecifier, dest); } int getInt(){ int i; get("%d", &i); printf("Works perfectly fine here: %d\n", i); return i; } int main(){ int j = getInt(); printf("The value is : %d\n", j); return 0; }
内容的提问来源于stack exchange,提问作者Nischal Tiwari
相关产品推荐
相关产品推荐

