此C程序给出了分段错误

时间:2019-11-30 09:43:35

标签: c

我正在编写一个c程序来测试将结构传递给函数

但是它给出了分割错误,为什么?

请给我解决该问题的解决方案?

下面给出了我尝试过的代码,

#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;
}

}

1 个答案:

答案 0 :(得分:0)

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

p1->m是类型char的变量。 strcpy函数期望一个有效的指向缓冲区的指针,该缓冲区的长度至少是作为strcpy的第二个参数传递的字符串的长度,包括零个终止符,在这种情况下,指向至少两个缓冲区的指针字符。

因为您传递了char值,所以该值被强制转换为一个指针,该指针(很可能是无效的指针值)。当strcpy试图取消对该指针值的引用时,会发生未定义的行为,该行为在您的平台上会产生一个segmentation fault,这实际上是在无效内存访问时引发的条件。

如果您要分配一个字符,只需将其分配给p1->m

p1->m = 's';

或者,如果要将字符串"s"存储在p1->m变量中,请将结构m的结构成员pixel_gray的声明更改为at的char缓冲区至少两个字符的长度。

struct pixel_gray {
    char m[2];
};