当前位置:首页 » 编程语言 » c语言违规代码
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言违规代码

发布时间: 2023-02-04 14:39:00

⑴ 为什么网上下的C语言程序都不能正常使用我最近学习C

网上下的C语言程序都不能正常使用,一般有这些原因:

  1. 硬件平台相关:

    如果你下的是硬件平台相关的代码,特别是单片机的C语言程序,代码里面有很多是硬件本身的专门特性,除了在指定开发平台上编译运行,否则不能直接拿来用的

  2. 操作系统相关:

    比如一些C语言的源代码可能使用了Linux的特性,但是你在Windows下直接编译就会报错

  3. C语言标准相关:

    如果用的是C11的特性,而你用的是C98标准的编译器,可能就执行不了,举例如下:

    for(int i=0;i<10;i++)

    这一句在老的编译器里面是编译不过的要改写成下面两行

    int i;

    for(i=0;i<10;i++)

  4. 源代码包含非法字符:

    因为排版问题,直接复制黏贴的代码可能包含很多非法字符,比如全角的引号、空格等,需要对源代码清理之后才能运行

  5. 需要第三方的库:

    如果源代码包含了第三方的库,(看开头的#include)这一行,如果你没有下载对应的库也是执行不了的

  6. 代码本身有问题

上面列出的是一些常见的可能性,具体的原因最好看一下你的编译器的输出才好确认。

⑵ C语言指针的问题:请问下C语言前辈们,是不是访问越界造成的calloc创建失败或者是指针访问违规

#define FILE_PATH_IN "C:\\DllTool.dll"
#define NEW_FILE_PATH_OUT "C:\\DllTool_new.dll"

PIMAGE_DOS_HEADER pDosHeader = NULL;
PIMAGE_NT_HEADERS32 pNTHeader = NULL;
PIMAGE_FILE_HEADER pPEHeader = NULL;
PIMAGE_OPTIONAL_HEADER32 pOptionHeader = NULL;
PIMAGE_SECTION_HEADER pSectionHeader = NULL;

FILE *pFile = NULL;
LPVOID pFileBuffer = NULL;
LPVOID pImageBuffer = NULL;
LPVOID pNewBuffer = NULL;
FILE *pNewFile = NULL;

size_t dwFileSize = 0;
size_t dwSize = 0;
DWORD i = 0;

//读取文件
pFile = fopen(FILE_PATH_IN, "rb");
fseek(pFile, 0L, SEEK_END);
dwFileSize = ftell(pFile);
fseek(pFile, 0L, SEEK_SET);
pFileBuffer = calloc(dwFileSize, sizeof(char));
if (pFileBuffer == NULL)
{
printf("申请pFileBuffer空间失败!\n");
return 0;
}
dwSize = fread(pFileBuffer, sizeof(char), dwFileSize, pFile);

//拉伸
pDosHeader = (PIMAGE_DOS_HEADER)pFileBuffer;
pNTHeader = (PIMAGE_NT_HEADERS32)((DWORD)pDosHeader + pDosHeader->e_lfanew);
pPEHeader = (PIMAGE_FILE_HEADER)((DWORD)pNTHeader + sizeof(pNTHeader->Signature));
pOptionHeader = (PIMAGE_OPTIONAL_HEADER32)((DWORD)pPEHeader + IMAGE_SIZEOF_FILE_HEADER);
pSectionHeader = (PIMAGE_SECTION_HEADER)((DWORD)pOptionHeader + pPEHeader->SizeOfOptionalHeader);

pImageBuffer = calloc(pOptionHeader->SizeOfImage, sizeof(char));
if (pImageBuffer == NULL)
{
printf("申请pImageBuffer空间失败!\n");
return 0;
}
memcpy(pImageBuffer, pFileBuffer, pOptionHeader->SizeOfHeaders);
for (i=0; i<pPEHeader->NumberOfSections; i++)
{
PIMAGE_SECTION_HEADER pTempSec = (PIMAGE_SECTION_HEADER)((DWORD)pSectionHeader + i * IMAGE_SIZEOF_SECTION_HEADER);
memcpy((void*)((DWORD)pImageBuffer + pTempSec->VirtualAddress), \
(void*)((DWORD)pFileBuffer + pTempSec->PointerToRawData), pTempSec->SizeOfRawData);
}
//就是这里,下面这个pNewBuffer空间申请失败,指针为NULL。我调试到上面这个循环出了问题,但不知道怎么解决,原来就一句:pSectionHeader++ 就解决的事件,但都不行,请高手们帮帮忙!!!谢谢了!!!
//压缩
pNewBuffer = calloc(dwSize, sizeof(char));
if (pNewBuffer == NULL)
{
printf("申请pNewBuffer空间失败!\n");
return 0;
}
memcpy(pNewBuffer, pImageBuffer, pOptionHeader->SizeOfHeaders);

//就是上面,我已经标注了,本人C语言算不上精通,请高手们不吝赐教,帮帮忙!!!谢谢了!!!收起
已经找到问题所在了,我换成其它DLL也没问题,是我写的这个DLL文件导出函数名使用了def自定名,但我在声明中又使用了extern "C",生成的DLL文件本身存在一点问题,所以在复制内容时,出问题了,看到此问题的大侠们,谢谢了,给大家造成困扰了,这个指针没有问题,循环内虽然pSection++最后指向最后一个节区数据,但是i已经使其跳出循环,没有任何问题!给大家造成困扰,实在对不起,有时代码看不出问题,其它要从其它方面查询,换个其它同样的文件应该测试一下,唉!