當前位置:首頁 » 文件傳輸 » vc讀取訪問許可權沖突怎麼解決
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

vc讀取訪問許可權沖突怎麼解決

發布時間: 2022-04-18 00:05:53

1. c語言 讀取訪問許可權沖突 怎麼解決

運行三次後, 最後一次 找abcd沒找到, 返回的q是NULL

導致p=q + strlen("abcd");

指向出錯。

這個可以找不到後退出。


while(*p!='')
{
char*q=strstr(p,"abcd");
if(q==NULL)break;
i++;
p=q+strlen("abcd");
}

2. 讀取CImage圖像像素矩陣時總是讀取訪問許可權沖突異常怎麼回事

CImage類是ATL和MFC共用的一個類,其頭文件為atlimage.h,主要用於圖片文件的打開,顯示與保存。這里需要注意的是,在VS2010和VS2012的MFC編程中,不需要將頭文件包含進來。MFC中要使用CImage類,必須先將頭文件包含進來,可以包含在當前代碼的CPP文件中,也可以包含在所屬類的頭文件中,不過最好還是包含在工程的stdafx.h文件中。CImage總共有39個成員函數。
外文名
cimage
頭文件
atlimage.h
主要作用
圖片文件的打開,顯示與保存
簡介
ATL和MFC共用的一個類
行為
保存圖片
保存圖片只有一個函數,就是Save函數,該函數有兩個參數,一個是文件的完整路徑和文件名,一個是文件的擴展名。但是如果只有保存和顯示圖片功能,CImage的Save函數發揮不了太大的作用,不過是一個轉存文件的工具。CImage的強大之處在於可以對圖片進行修改,再進行保存。
修改圖片的函數有這么3個函數可以修改圖片,都是像素級的操作。這三個函數分別為SetPixel,SetPixelRGB,SetPixelIndexed。可以通過雙重循環對屏幕進行逐點掃描,並把像素顏色值保存到CImage對象中達到截屏的目的。
我們可以用一段很簡單的代碼來實現將DC(設備上下文)里繪制的圖形存入圖片文件中。基本的思想是先初始化一個CImage對象,再為它設定大小和位數,也就是圖片大小和圖片的色彩總數,再用設備上下文繪圖。繪制完圖形後再建立另外一個設備上下文對象,稱為目的DC,將之前繪圖的DC稱為源DC,目的DC必須與CImage對象關聯起來,然後利用BitBlt函數和其他函數將繪圖DC的內容拷貝到目的DC中,最後將CImage對象保存到文件中,以下是代碼實現(VS2010支持中文變數名):
CRect rect;
this->GetClientRect(rect);
CImage image;
image.Create(rect.Width(),rect.Height(),24);
CDC* DCpoint=this->GetDC();
DCpoint->Ellipse(20,20,200,200);
CDC dstDC;
dstDC.CreateCompatibleDC(DCpoint);
dstDC.SelectObject(image);
dstDC.BitBlt(0,0,rect.Width(),rect.Height(),DCpoint,0,0,SRCCOPY);
image.Save(L"D:\\用戶目錄\\Pictures\\寫圖片文件.jpg");
顯示圖片
首先看下面這段代碼
CImage image;
image.Load(L"D:\\用戶目錄\\Pictures\\example.jpg");
image.Draw(GetDC()->m_hDC,CRect(0,0,320,240));
CImage類支持以Load方法讀取本地磁碟上的文件,並用Draw方法來顯示圖片。CIamge類的成員函數中還有很多可以實現顯示圖片。例如BitBlt辦法。如以下代碼:
image.BitBlt(GetDC()->m_hDC,0,0,320,240,0,0,SRCCOPY);
Bitblt方法同CDC類的Bitblt函數一樣,是一比一地復制圖像並顯示在屏幕上,支持對源圖像取反,也就是反色顯示。這樣功能通過BitBlt的最後一個參數來實現,比如參數為NOTSRCCOPY就是反色顯示。
MaskBlt可以將圖片與目的圖片進行特殊的光柵操作並進行掩碼處理。
PlgBlt函數可以將圖片拉伸成平行四邊形進行顯示。
StretchBlt函數可以將圖片進行拉伸顯示。

3. 讀取訪問許可權沖突

會不會是SETUP。EXE本體上有錯誤而非系統故障。如果是這樣建議換一種下載版的安裝試試。推介龍卷風CS3合集,是免激活的直接安裝使用!

4. vc++讀取位置時發生訪問沖突是怎麼回事

一般都是指針問題,比如沒有為指針分配內存,解決辦法檢查指針是否為空;
還有就是多線程中,兩個線程同時訪問同一塊內存,解決辦法加鎖

5. vs2017,運行時出現"未找到image.cpp,已引發異常,讀取訪問許可權沖突怎麼辦

有時候,我們使用 VS(Visual Studio)編譯程序時會出現「無法查找或打開PDB文件」的提示,並且此時程序會生成失敗,無法運行,如下圖所示:


如上圖所示,由於pdb文件,又名「符號文件」,所以「已載入符號」,也就是成功載入了動態鏈接庫對應的pdb文件。

6. vc++中0xC0000005: 讀取位置 0x00000004 時發生訪問沖突

0xC0000005 應用程序初始化錯誤

0x00000004 內存地址

請查看是否存在內存分配錯誤

7. c語言訪問內存沖突,這該怎麼辦啊

、C中內存分為四個區
棧:用來存放函數的形參和函數內的局部變數。由編譯器分配空間,在函數執行完後由編譯器自動釋放。 
堆:用來存放由動態分配函數(如malloc)分配的空間。是由程序員自己手動分配的,並且必須由程序員使用free釋放。如果忘記用free釋放,會導致所分配的空間一直占著不放,導致內存泄露。 
全局局:用來存放全局變數和靜態變數。存在於程序的整個運行期間,是由編譯器分配和釋放的。 
文字常量區:例如char *c = 「123456」;則」123456」為文字常量,存放於文字常量區。也由編譯器控制分配和釋放。 
程序代碼區:用來存放程序的二進制代碼。
例子(一) 
int a = 0; //全局區 
void main() 

int b; //棧 
char s[] = abc; //s在棧,abc在文字常量區 
char *p1,*p2; //棧 
char *p3 = 123456; //123456在常量區,p3在棧上 
static int c =0; //全局區 
p1 = (char *)malloc(10); //p1在棧,分配的10位元組在堆 
p2 = (char *)malloc(20); //p2在棧,分配的20位元組在堆 
strcpy(p1, 123456); //123456放在常量區 

例子(二) 
//返回char型指針 
char *f() 

//s數組存放於棧上 
char s[4] = {'1','2','3','0'}; 
return s; //返回s數組的地址,但程序運行完s數組就被釋放了 

void main() 

char *s; 
s = f(); 
printf (%s, s); //列印出來亂碼。因為s所指向地址已經沒有數據 

2、動態分配釋放內存
用malloc動態分配內存後一定要判斷一下分配是否成功,判斷指針的值是否為NULL。 
內存分配成功後要對內存單元進行初始化。 
內存分配成功且初始化後使用時別越界了。 
內存使用完後要用free(p)釋放,注意,釋放後,p的值是不會變的,仍然是一個地址值,仍然指向那塊內存區,只是這塊內存區的值變成垃圾了。為了防止後面繼續使用這塊內存,應在free(p)後,立即p=NULL,這樣後面如果要使用,判斷p是否為NULL時就會判斷出來。

NO.1
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str,hello world);
printf(str);
}
請問運行Test函數後會是什麼樣的結果?
NO.2
char *GetMemory(void)
{
char p[] = hello world;
retrun p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
問題同NO.1
NO.3
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str,100);
strcpy(str,hello);
printf(str);
}
問題同NO.1
NO.4
void Test(void)
{
char *str = (char *)malloc(100);
strcpy(str,hello);
free(str);
if(str != NULL)

strcpy(str,world);
printf(str);
}
}
問題同NO.1
我對以上問題的分析:
NO.1:程序首先申請一個char類型的指針str,並把str指向NULL(即str里存的是NULL的地址,*str為NULL中的值為0),調用函數的過程中做了如下動作:1申請一個char 類型的指針p,2把str的內容到了p里(這是參數傳遞過程中系統所做的),3為p指針申請了100個空間,4返回Test函數.最後程序把字元串hello world拷貝到str指向的內存空間里.到這里錯誤出現了!str的空間始終為NULL而並沒有實際的空間.深刻理解函數調用的第2步,將不難發現問題所在!(建議:畫圖理解)
NO.2:程序首先申請一個char類型的指針str,並把str指向NULL.調用函數的過程中做了如下動作:1申請一數組p[]並將其賦值為hello world(數組的空間大小為12),2返回數組名p付給str指針(即返回了數組的首地址).那麼這樣就可以列印出字元串"hello world"了么?當然是不能的!因為在函數調用的時候漏掉了最後一步.也就是在第2步return數組名後,函數調用還要進行一步操作,也就是釋放內存空間.當一個函數被調用結束後它會釋放掉它裡面所有的變數所佔用的空間.所以數組空間被釋放掉了,也就是說str所指向的內容將不確定是什麼東西.
NO.3:正確答案為可以列印出hello.但內存泄漏了! 
NO.4:申請空間,拷貝字元串,釋放空間.前三步操作都沒有任何問題.到if語句里的判斷條件開始出錯了,因為一個指針被釋放之後其內容並不是NULL,而是一個不確定的值.所以if語句永遠都不能被執行.這也是著名的"野"指針問題.所以我們在編寫程序釋放一個指針之後一定要人為的將指針付成NULL.這樣就會避免出現"野"指針的出現.有人說"野"指針很可怕,會帶來意想不到的錯誤.

C語言內存對齊

C99規定int、unsigned int和bool可以作為位域類型,但編譯器幾乎都對此作了擴展,允許其它類型類型的存在。

使用位域的主要目的是壓縮存儲,其大致規則為:
1) 如果相鄰位域欄位的類型相同,且其位寬之和小於類型的sizeof大小,則後面的欄位將緊鄰前一個欄位存儲,直到不能容納為止;
2) 如果相鄰位域欄位的類型相同,但其位寬之和大於類型的sizeof大小,則後面的欄位將從新的存儲單元開始,其偏移量為其類型大小的整數倍;
3) 如果相鄰的位域欄位的類型不同,則各編譯器的具體實現有差異,VC6採取不壓縮方式,Dev-C++採取壓縮方式;
4) 如果位域欄位之間穿插著非位域欄位,則不進行壓縮;
5) 整個結構體的總大小為最寬基本類型成員大小的整數倍。

還是讓我們來看看例子。
示例1:
struct BF1
{
char f1 : 3;
char f2 : 4;
char f3 : 5;
};
其內存布局為:
|_f1__|__f2__|_|____f3___|____|
|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|
0 3 7 8 1316
位域類型為char,第1個位元組僅能容納下f1和f2,所以f2被壓縮到第1個位元組中,而f3隻能從下一個位元組開始。因此sizeof(BF1)的結果為2。
示例2:
struct BF2
{
char f1 : 3;
short f2 : 4;
char f3 : 5;
};
由於相鄰位域類型不同,在VC6中其sizeof為6,在Dev-C++中為2。
示例3:
struct BF3
{
char f1 : 3;
char f2;
char f3 : 5;
};

 

什麼是內存對齊

    考慮下面的結構:

         struct foo
         {
           char c1;
           short s;
           char c2;
           int i;
          };
    
    假設這個結構的成員在內存中是緊湊排列的,假設c1的地址是0,那麼s的地址就應該是1,c2的地址就是3,i的地址就是4。也就是
    c1 00000000, s 00000001, c2 00000003, i 00000004。

    可是,我們在Visual c/c++ 6中寫一個簡單的程序:

         struct foo a;
    printf("c1 %p, s %p, c2 %p, i %p/n",
        (unsigned int)(void*)&a.c1 - (unsigned int)(void*)&a,
        (unsigned int)(void*)&a.s - (unsigned int)(void*)&a,
        (unsigned int)(void*)&a.c2 - (unsigned int)(void*)&a,
        (unsigned int)(void*)&a.i - (unsigned int)(void*)&a);
    運行,輸出:
         c1 00000000, s 00000002, c2 00000004, i 00000008。

    為什麼會這樣?這就是內存對齊而導致的問題。

為什麼會有內存對齊

    以下內容節選自《Intel Architecture 32 Manual》。
    字,雙字,和四字在自然邊界上不需要在內存中對齊。(對字,雙字,和四字來說,自然邊界分別是偶數地址,可以被4整除的地址,和可以被8整除的地址。)
    無論如何,為了提高程序的性能,數據結構(尤其是棧)應該盡可能地在自然邊界上對齊。原因在於,為了訪問未對齊的內存,處理器需要作兩次內存訪問;然而,對齊的內存訪問僅需要一次訪問。
    一個字或雙字操作數跨越了4位元組邊界,或者一個四字操作數跨越了8位元組邊界,被認為是未對齊的,從而需要兩次匯流排周期來訪問內存。一個字起始地址是奇數但卻沒有跨越字邊界被認為是對齊的,能夠在一個匯流排周期中被訪問。
    某些操作雙四字的指令需要內存操作數在自然邊界上對齊。如果操作數沒有對齊,這些指令將會產生一個通用保護異常(#GP)。雙四字的自然邊界是能夠被16整除的地址。其他的操作雙四字的指令允許未對齊的訪問(不會產生通用保護異常),然而,需要額外的內存匯流排周期來訪問內存中未對齊的數據。

編譯器對內存對齊的處理

    預設情況下,c/c++編譯器默認將結構、棧中的成員數據進行內存對齊。因此,上面的程序輸出就變成了:
c1 00000000, s 00000002, c2 00000004, i 00000008。
編譯器將未對齊的成員向後移,將每一個都成員對齊到自然邊界上,從而也導致了整個結構的尺寸變大。盡管會犧牲一點空間(成員之間有空洞),但提高了性能。
也正是這個原因,我們不可以斷言sizeof(foo) == 8。在這個例子中,sizeof(foo) == 12。

如何避免內存對齊的影響

    那麼,能不能既達到提高性能的目的,又能節約一點空間呢?有一點小技巧可以使用。比如我們可以將上面的結構改成:

struct bar
{
    char c1; 
    char c2;
    short s;
    int i;
};
    這樣一來,每個成員都對齊在其自然邊界上,從而避免了編譯器自動對齊。在這個例子中,sizeof(bar) == 8。

    這個技巧有一個重要的作用,尤其是這個結構作為API的一部分提供給第三方開發使用的時候。第三方開發者可能將編譯器的默認對齊選項改變,從而造成這個結構在你的發行的DLL中使用某種對齊方式,而在第三方開發者哪裡卻使用另外一種對齊方式。這將會導致重大問題。
    比如,foo結構,我們的DLL使用默認對齊選項,對齊為
c1 00000000, s 00000002, c2 00000004, i 00000008,同時sizeof(foo) == 12。
而第三方將對齊選項關閉,導致
    c1 00000000, s 00000001, c2 00000003, i 00000004,同時sizeof(foo) == 8。

如何使用c/c++中的對齊選項

    vc6中的編譯選項有 /Zp[1|2|4|8|16] ,/Zp1表示以1位元組邊界對齊,相應的,/Zpn表示以n位元組邊界對齊。n位元組邊界對齊的意思是說,一個成員的地址必須安排在成員的尺寸的整數倍地址上或者是n的整數倍地址上,取它們中的最小值。也就是:
    min ( sizeof ( member ),  n)
    實際上,1位元組邊界對齊也就表示了結構成員之間沒有空洞。
    /Zpn選項是應用於整個工程的,影響所有的參與編譯的結構。
    要使用這個選項,可以在vc6中打開工程屬性頁,c/c++頁,選擇Code Generation分類,在Struct member alignment可以選擇。

    要專門針對某些結構定義使用對齊選項,可以使用#pragma pack編譯指令。指令語法如下:
#pragma pack( [ show ] | [ push | pop ] [, identifier ] , n  )
    意義和/Zpn選項相同。比如:

#pragma pack(1)
struct foo_pack
{
    char c1;
    short s;
    char c2;
    int i;
};
#pragma pack()

棧內存對齊

    我們可以觀察到,在vc6中棧的對齊方式不受結構成員對齊選項的影響。(本來就是兩碼事)。它總是保持對齊,而且對齊在4位元組邊界上。

驗證代碼

#include <stdio.h>

struct foo
{
    char c1;
    short s;
    char c2;
    int i;
};

struct bar
{
    char c1; 
    char c2;
    short s;
    int i;
};

#pragma pack(1)
struct foo_pack
{
    char c1;
    short s;
    char c2;
    int i;
};
#pragma pack()

int main(int argc, char* argv[])
{
    char c1;
    short s;
    char c2;
    int i;

    struct foo a;
    struct bar b;
    struct foo_pack p;

    printf("stack c1 %p, s %p, c2 %p, i %p/n",
        (unsigned int)(void*)&c1 - (unsigned int)(void*)&i,
        (unsigned int)(void*)&s - (unsigned int)(void*)&i,
        (unsigned int)(void*)&c2 - (unsigned int)(void*)&i,
        (unsigned int)(void*)&i - (unsigned int)(void*)&i);

    printf("struct foo c1 %p, s %p, c2 %p, i %p/n",
        (unsigned int)(void*)&a.c1 - (unsigned int)(void*)&a,
        (unsigned int)(void*)&a.s - (unsigned int)(void*)&a,
        (unsigned int)(void*)&a.c2 - (unsigned int)(void*)&a,
        (unsigned int)(void*)&a.i - (unsigned int)(void*)&a);

    printf("struct bar c1 %p, c2 %p, s %p, i %p/n",
        (unsigned int)(void*)&b.c1 - (unsigned int)(void*)&b,
        (unsigned int)(void*)&b.c2 - (unsigned int)(void*)&b,
        (unsigned int)(void*)&b.s - (unsigned int)(void*)&b,
        (unsigned int)(void*)&b.i - (unsigned int)(void*)&b);

    printf("struct foo_pack c1 %p, s %p, c2 %p, i %p/n",
        (unsigned int)(void*)&p.c1 - (unsigned int)(void*)&p,
        (unsigned int)(void*)&p.s - (unsigned int)(void*)&p,
        (unsigned int)(void*)&p.c2 - (unsigned int)(void*)&p,
        (unsigned int)(void*)&p.i - (unsigned int)(void*)&p);

    printf("sizeof foo is %d/n", sizeof(foo));
    printf("sizeof bar is %d/n", sizeof(bar));
    printf("sizeof foo_pack is %d/n", sizeof(foo_pack));
    
    return 0;
}

8. 使用VC中的fopen文件打開函數時發生沖突錯誤。

給點建議:
1.重新編譯工程,確定沒有錯誤或者警告。
2.
Init(char *filename,int j)
{
fopen(Filename, "rb")
}
在fopen處增加一個斷點。按下F5調試,查看得到的參數filename是否為你設定的字元串。
3.有點疑問:你這樣fopen以後,如何關閉文件,又如何使用文件?

9. 請問你vc那個沖突是怎麼解決的啊,謝謝哦

你是說VC++軟體 無法打開是吧,首先卸載全部的VC++版本,再進入注冊表刪除關於VC++的的有注冊表信息。重新啟電腦,再重新安裝就可以了。

10. 讀取訪問許可權沖突 this 是 0X308

這種錯誤一般是指訪問了不屬於自己的內存空間。出現這種錯誤有幾種原因:1、給一個數組分配了比較小的內存空間,然後又給該數組賦了一個比較大的值,舉例說明:charbuf[10];buf=C++讀取位置0x******時發生訪問沖突的可能原因C++讀取位置0x******時發生訪問沖突的可能原因;這樣才訪問buf的時候,就會出現錯誤解決方法:給數組分配更大一些的內存空間,如charbuf[1000];2、句柄或指針在使用前被釋放解決方法:檢查代碼配合調試,揪出野指針分析:內存沖突問題經常發生於用malloc等進行內存分配後指針的使用。C和C++中的指針,其優勢很明顯,靈活,方便,使用起來簡單;劣勢當然也很明顯,就是容易導致系統崩潰,指針操作不當,或沒有及時釋放,或沒有判斷指針是否越界,或沒有及時置空,這些都很容易導致系統崩潰,所以使用指針一定要考慮嚴謹