簡體   English   中英

這個c程序給出了一個分段錯誤

[英]This c program gives a segmentation fault

我正在編寫 ac 程序來測試傳遞給函數的結構

但它給出了分段錯誤,為什么?

請給我解決這個問題的方法?

我試過的代碼如下,

 #include <stdio.h> #include <string.h> #define GRAYSCALE void set_pixel_data(int depth, void *p); struct pixel_gray { char m; }; struct pixel_color { char r; char g; char b; }; int main() { struct pixel_gray pg; struct pixel_color pc; #ifdef GRAYSCALE set_pixel_data( 1, &pg); #else set_pixel_data( 3, &pc); #endif return(0); } void set_pixel_data(int depth, void *p) { switch(depth) { struct pixel_gray* p1; case 1: p1=(struct pixel_gray*)p; strcpy(p1->m,"s"); //here is the problem //printf("%s",p1->m); break; case 3: printf("33"); break; default: printf("nothing he he "); break; } }

struct pixel_gray { char m; };
p1=(struct pixel_gray*)p;
strcpy(p1->m,"s");

p1->mchar類型的變量。 strcpy函數需要一個指向緩沖區的有效指針,其長度至少為作為第二個參數傳遞給strcpy的字符串的長度,包括零終止字符,在本例中為指向至少兩個字符的緩沖區的指針。

因為您傳遞了一個char值,所以該值被轉換為一個指針,這(很可能)是一個無效的指針值。 strcpy嘗試取消引用該指針值時,會發生未定義的行為,在您的平台上會出現分段錯誤,這實際上是在無效內存訪問時引發的情況。

如果要分配單個字符,只需將其分配給p1->m

p1->m = 's';

或者,如果要將字符串"s"存儲在p1->m變量中,請將結構pixel_gray的結構成員m的聲明更改為至少兩個字符長度的 char 緩沖區。

struct pixel_gray {
    char m[2];
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM