c - 错误返回修改指针

标签 c pointers return-value pass-by-reference

我是 C 编程的新手。经过几个小时的研究,我遇到了一个问题,但仍然无法解决。如果您需要示例,我将在下面粘贴我的(基本)源代码。问题基本上如下:

我有一个方法,成功返回 1,否则返回 0。它接受一个用作函数实际返回值的 int 指针,这意味着传递的指针由该方法修改。稍后我需要使用修改后的值。该行为应类似于 fgets 或 scanf 等函数中的缓冲区指针。这工作正常,直到我尝试从调用函数返回修改后的指针值。我收到一个访问冲突错误,并且 int 值是负最大值,resp。不明确的。我该如何正确地做到这一点?

我之前读过有关双指针的内容,但无法弄清楚如何将这种技术合并到我的程序中......双指针是正确的方法吗?

下面是我的源代码供引用:)

int validateInteger(int *out) {
    char buffer[17];
    fgets(buffer, 16, stdin);
    if (sscanf(buffer, "%d")) {
        *out = atoi(buffer);
        return 1;
    }
    return 0;
}

int anotherFunction() {
    int selection = 0;

    while(1) {
        printf("Print something...");

        if (validateInteger(&selection) && selection >= 0 && selection <= 7) {
            break;
        } else {
            clearScreen();
        }
    }
    return selection;
}

int main() {

    while(1) {
        int sel = anotherFunction(); // THIS IS WHAT DOESN'T WORK!

        switch (sel) {
        case 0:
            return 0;
        default:
            printf("Print some error msg here...");
            return 1;
        }
    }
}

如有任何帮助,我们将不胜感激。 提前谢谢你们!

最佳答案

问题出在以下几行:

if (sscanf(buffer, "%d")) {
    *out = atoi(buffer);
    return 1;
}
  1. 您不需要同时使用 sscanfatoi。您只需使用其中一个。
  2. 您忘记将out 传递给sscanf。当格式字符串包含 %d 时,该函数会查找指向 int 的指针以将数据读入其中。由于您没有传递该参数,程序会导致未定义的行为。在您的情况下,它会导致访问冲突错误。

使用

if (sscanf(buffer, "%d", out) == 1) {
   return 1;
}

您也可以使用以下行代替前面的行。

*out = atoi(buffer);
return 1;

但是,使用这种方法检查错误的唯一方法是检查*out 的值是否为0。如果 0 是合法值,则使用第二种方法并不好。因此,我推荐第一种方法。

关于c - 错误返回修改指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34209205/

相关文章:

c++ - 指向固定大小数组行为的指针

c - 如何在 struct 中为 char* 字段分配内存

c++ - 在变量返回之前存储值

C 小代码将无法工作。

c - 使用位操作测试整数是否为大写 ASCII 字母

c - 带有指针的 B 树

c++ - 关于 C++ 中 std::promise 的错误

powershell - 从 PowerShell 运行 MsiExec 并获取返回代码

c - 进程返回 -1073741819 (0xc0000005) Code::Blocks

c - K&R的getc和putc实现对吗?