我正在编写一个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;
}
}
答案 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];
};