當前位置:首頁 » 編程語言 » 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已經使其跳出循環,沒有任何問題!給大家造成困擾,實在對不起,有時代碼看不出問題,其它要從其它方面查詢,換個其它同樣的文件應該測試一下,唉!