You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 10:05:21