【问题标题】:while not working inside main虽然不在 main 内部工作
【发布时间】:2014-12-11 22:11:00
【问题描述】:

我想尝试一些win32 函数来管理文件。 特别是,我想创建一个程序,将文件作为输入,并将其打印出来。

#include <stdio.h>
#include <windows.h>
#include <stdlib.h>

void prova()
{
    int z = 0;
        while(z<5)
        {
            puts("Helloworld!");
            z++;
        }
}

int m = 0;

int main(int argc, char **argv)
{
    LPDWORD lpFileSizeHigh;
    HANDLE file;
    file = CreateFile(
            argv[1],
            GENERIC_READ,
            FILE_SHARE_READ,
            NULL,
            OPEN_EXISTING,
            FILE_ATTRIBUTE_NORMAL,
            NULL);

    if(file == INVALID_HANDLE_VALUE)
    {
        printf("Error on opening the file: %x", GetLastError());
        return 1;
    }

    DWORD fileSize = GetFileSize(file, lpFileSizeHigh);

    CloseHandle(file);

    printf("fileSize:   %d\n", fileSize );


    prova();

    while(m<5)
    {
        puts("Hello, world!");
        m++;
    }

    return 0;
}

为了清晰和简洁,我重新编写了代码并删除了未到达的反转部分。

这段代码运行良好,它打印了 10 次 Hello, World。但是,如果您在 main 函数中定义 m 变量,它会由于某种原因停止响应。 如果我删除文件相关代码,它会再次开始工作 O_o 我是 c 语言的菜鸟,因为我没有太多经验,但我不明白为什么会这样。

我在 Windows 8 上,使用 Eclipse 和 mingw。

【问题讨论】:

  • 当你在 main() 中声明它时,你是否也将它初始化为 0?
  • 编译所有警告和调试信息。了解如何使用调试器。
  • @FatalError 我将您看到的代码 (int m=0) 剪切粘贴到括号后的 main 中。
  • @DavidHeffernan 此代码有效。正如我所说,只需将 int m=0 移动到 main 内,它将不起作用。有那么难吗?下次我将复制整个代码的 2 倍,因为你不能剪切粘贴一行;)
  • @BasileStarynkevitch 调试器对我没有帮助,因为它也被终止了。似乎它在 DWORD fileSize = GetFileSize(file, lpFileSizeHigh); 之后被杀死还是谢谢!

标签: c winapi while-loop


【解决方案1】:
LPDWORD lpFileSizeHigh;

这会分配一个指针,但不会初始化它。

DWORD fileSize = GetFileSize(file, lpFileSizeHigh);

这会将未初始化的指针传递给GetFileSize,此时任何事情都可能发生。

声明一个变量:

DWORD FileSizeHigh;

并传递它的地址:

DWORD fileSize = GetFileSize(file, &FileSizeHigh);

FWIW,GetFileSizeEx 更容易使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 2012-11-27
    相关资源
    最近更新 更多