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

C语言跨函数传递图片文件路径 全局变量无法识别问题求助

问题根因

  • 你虽然用scanf_s读取了用户输入的路径存到filepath局部数组,也把全局指针location指向了这个数组,但调用loadImage的时候根本没传这个读取到的路径,而是传了argv[1](也就是命令行参数里的路径),没有传入命令行参数的情况下自然找不到目标文件。
  • 逻辑顺序错误:读取用户输入路径后,你立刻判断argc != 2就直接返回1退出程序,哪怕用户正确输入了路径也不会走到后续加载逻辑。
  • scanf_s用法错误:读取字符串时不需要对数组名取地址,同时必须传入缓冲区最大可读长度,你当前的写法存在缓冲区溢出风险。
  • 全局变量location完全失效:loadImage函数的形参名就叫location,同名情况下函数内部只会访问形参,全局变量直接被屏蔽,起不到跨函数传值的作用。
  • 全局变量本身就没有必要使用,函数间直接传参就可以满足路径传递的需求,还能避免全局变量带来的各类隐患。

修复方案

直接修改main函数即可,无需保留无用的全局location变量:

int main(int argc, char ** argv)
{
  char filepath[99] = {0};
  char *load_path = NULL;
  // 优先使用命令行参数传入的路径,没有则提示用户手动输入
  if (argc == 2)
  {
    load_path = argv[1];
  } 
  else
  {
    printf("Enter file path: \n");
    // scanf_s读取字符串的正确写法,预留1位存储字符串结束符
    scanf_s("%s", filepath, (unsigned int)(sizeof(filepath) - 1));
    load_path = filepath;
  }

  puts(load_path);
  setbuf(stdout, 0);

  numScale = strlen(scale) - 1;
  printf("ASCII Brightness Scale: %d\n", numScale);

  image *img = NULL;
  // 传入实际的加载路径即可
  if (loadImage(&img, load_path))
  {
    printf("Image dimensions: %zux%zu\n", img->width, img->height);
    char buf[1000000]; // 1M空间足够存储常规尺寸的字符画
    sprintchar(buf, img);
    printf("%s", buf); // 放开注释即可在终端输出ASCII字符画
    release(img);
  }

  return 0;
}

如果你不需要支持命令行参数传路径,直接删掉argc相关的判断逻辑,只保留读取用户输入路径的逻辑即可。

内容的提问来源于stack exchange,提问作者EMAROH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 07:54:05