2

我有一个简单的 C 代码如下:

#pragma warning(disable : 4996)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <process.h>
#include <math.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <windows.h>

#include <tchar.h>
int main()
{
    int ndsc;
    char *line = ' ';
    FILE *fd;
    int  x;
    wchar_t path[256];

    wcscpy(path, L"C:/");

    //wcscat(path, L"common\\descr.txt", wcslen(L"common\\descr.txt"));
    //Previous
    wcscat(path, L"common/descr.txt");



    if ((fd = _wfopen(path, L"r")) == NULL)
    {
        printf("Can't open %s for reading.\n", path);
        return 1;
    }
    for (ndsc = 0; fgetws((wchar_t*)line, 80, fd) != NULL; ndsc++)
    {
        x = wcslen((const wchar_t*)line);
        printf("Length of %d line is %d\n", ndsc, x);
    }
    fclose(fd);
    return 0;
}

我正在尝试从 C:\Common 目录中读取一个名为 descr.txt 的文件。但在 for 循环中,它会抛出未处理的异常,如下所示:

无法读取内存

例外

谁能解释我为什么会收到此错误以及如何解决。顺便说一句,此代码正在 AutoCad 的 .arx 文件中使用。我刚刚提取了抛出错误的部分,并尝试在 VS 2015 Update 3 中将其作为独立项目运行。此代码是从 .NET 调用的 .C 文件的一部分。即使在 .arx 的上下文中执行(从 AutoCad 单击所需菜单)也会出现相同的异常。

提前致谢。

4

4 回答 4

4

此处:char *line = ' '; 您将 a 分配char给 a char *

稍后您尝试使用宽字符串缓冲区。您需要wchar_t line[80]实际为 80 分配空间wchar_t

于 2017-08-04T11:47:08.130 回答
1

该变量line是一个指针,它指向地址 32(使用ASCII编码)。

该地址几乎不是写入输入字符串的有效地址。

您需要让它指向一些足够大的内存以适合您读取的整个字符串(包括终止符)。或者让它成为一个数组。

由于指针不正确,您将有未定义的行为,这会使您的整个程序格式错误且无效。

此外,您需要在调用中强制转换它fgetsw您做错事的另一个char迹象,那就是使用错误的类型(而不是wchar_t)。

于 2017-08-04T11:48:00.427 回答
0

您正试图通过使用简单的引号将 a 分配给chara 。char *

如果要直接将 anint或 a分配char给 a char *,请使用双引号 ( " "),或者,如果它是单个char,则可能需要执行以下操作:

char line[0] = ' ';

确保您的指针已被 malloc 处理,它应该可以解决问题。

如果需要,稍后可以将一串数字重新转换为 int atoi()

于 2017-08-04T12:06:37.640 回答
0

Line 是指向从 ' ' 的 ascii 代码的 int 值转换而来的一些非法地址的指针。

代替char *line = ' ';

制作它(如果你希望 line 是一个字符数组)

 char line[80 * sizeof(wchar_t)];
于 2017-08-04T11:56:10.570 回答