Can';我不明白为什么我';m由于strncpy而出现分段错误
当我使用Can';我不明白为什么我';m由于strncpy而出现分段错误,c,malloc,C,Malloc,当我使用strncpy时,我遇到了一个分段错误,我不知道如何修复它 这是我的矩形.h文件。这只是一个头文件 #define NAMESIZE 20 struct point { int x; int y; }; struct rectangle { struct point upperleft; struct point lowerright; //char label[NAMESIZE + 1]; char *label; }; struc
strncpy
时,我遇到了一个分段错误,我不知道如何修复它
这是我的矩形.h
文件。这只是一个头文件
#define NAMESIZE 20
struct point {
int x;
int y;
};
struct rectangle {
struct point upperleft;
struct point lowerright;
//char label[NAMESIZE + 1];
char *label;
};
struct point *create_point(int x, int y);
struct rectangle *create_rectangle(struct point ul, struct point lr,
char *label);
int area1(struct rectangle r);
int area2(struct rectangle *r);
void change_label(struct rectangle *r, char *newlabel);
void broken_change_label(struct rectangle r, char * newlabel);
void print_rectangle(struct rectangle *r);
这是我的rectangle.c
文件。我将展示其中的一个函数:
/*create_rectangle动态分配内存来存储矩形
*并返回指向新创建矩形的指针。
*/
在上面的代码中,我使用malloc
为标签指针分配足够的空间
当我运行下面的tester.c
程序时,我得到一个分段错误(由于strncpy
)
我怀疑我遇到了分段错误,因为我直接在r2.label上执行strncpy
。我怀疑,因为我没有为矩形结构中的char*label
分配任何空间,所以我得到了一个分段错误。但是当我写作的时候
char *label = malloc(sizeof(NAMESIZE) * sizeof(char));
我得到一个错误:
error: expected ';' at end of declaration list` error.
在create\u rectangle
中为标签创建malloc
strlen(标签)
字节,然后在strlen(标签)+1
字节中复制。请注意,如果要复制的新标签较长,则会溢出该分配。但正如@YuHao指出的,这并不重要,因为您从未初始化过r2
(特别是label
)的任何字段。您malloc
strlen(label)
在创建矩形中为标签创建字节,然后在strlen(label)+1
字节中复制。请注意,如果要复制的新标签较长,则会溢出该分配。但正如@YuHao所指出的,这并不重要,因为您从未初始化过r2
(尤其是label
)的任何字段
您正在错误分配终止字符,应该是
r->label = malloc((strlen(label)+1) * sizeof(char));
您正在错误分配终止字符,应该是
r->label = malloc((strlen(label)+1) * sizeof(char));
您正试图写入r2.label
,该指针未分配任何空间
请注意分配空间的代码:
r->label = malloc(strlen(label) * sizeof(char));
strlen(label)
不够,字符串需要以null结尾
您正试图写入r2.label
,该指针未分配任何空间
请注意分配空间的代码:
r->label = malloc(strlen(label) * sizeof(char));
strlen(label)
还不够,字符串需要以null结尾。看起来,正如您所说,您没有为char*标签分配任何内存
做:
看起来,正如您所说,您没有为char*标签分配任何内存
做:
此代码:
r->label = malloc(strlen(label) * sizeof(char));
strncpy(r->label, label, strlen(label) + 1);
应该是:
r->label = malloc( strlen(label) + 1 );
strcpy( r->label, label );
- 您需要为空终止符分配空间李>
sizeof(char)
总是1
strcpy
函数在写入strlen(label)+1
字节后完成,因此尝试使用strncpy
是多余的李>
strncpy
通常相当危险,因为它有时不输出字符串;我的建议是永远不要使用它
再往下
strncpy(r2.label, str2, NAMESIZE);
错误,因为r2.label
当前是一个通配符指针。您还需要以相同的方式分配内存:
r2.label = malloc( strlen(str2) + 1 );
strcpy( r2.label, str2 );
此代码:
r->label = malloc(strlen(label) * sizeof(char));
strncpy(r->label, label, strlen(label) + 1);
应该是:
r->label = malloc( strlen(label) + 1 );
strcpy( r->label, label );
- 您需要为空终止符分配空间李>
sizeof(char)
总是1
strcpy
函数在写入strlen(label)+1
字节后完成,因此尝试使用strncpy
是多余的李>
strncpy
通常相当危险,因为它有时不输出字符串;我的建议是永远不要使用它
再往下
strncpy(r2.label, str2, NAMESIZE);
错误,因为r2.label
当前是一个通配符指针。您还需要以相同的方式分配内存:
r2.label = malloc( strlen(str2) + 1 );
strcpy( r2.label, str2 );
仔细考虑<代码> STRNCPY 是否是工作的正确工具。它不仅仅是一个“更安全的”strcpy
。见,以及报告的问题13.2。(我不是说这就是你看到的问题的原因。)malloc(sizeof(NAMESIZE)*sizeof(char))
-什么<代码>命名空间是int,因此这可能分配4个字节。仔细考虑<代码> STRNCPY < /COD>是否是作业的正确工具。它不仅仅是一个“更安全的”strcpy
。见,以及报告的问题13.2。(我不是说这就是你看到的问题的原因。)malloc(sizeof(NAMESIZE)*sizeof(char))
-什么NAMESIZE
是一个int,因此可能会分配4个字节。如果字符串不是以null结尾的,会发生什么?那么它就不是字符串。字符串的含义是:后跟空终止符的一系列字符。如果字符串不是空终止符,会发生什么?那么它就不是字符串。字符串的含义是:后跟空终止符的一系列字符。有没有办法在结构本身中为标签字符串文本保留空间?类似于:char*label=malloc(sizeof(NAMESIZE)+1);是,更改为char标签[NAMESIZE+1]代码>停止写入sizeof(NAMESIZE)
<代码>命名
是20
sizeof(NAMESIZE)
表示sizeof(20)
,即存储int20
所需的字节数。它是sizeof(int)
,在通用系统上是4或8。有没有办法在结构本身中为标签字符串文本保留空间?类似于:char*label=malloc(sizeof(NAMESIZE)+1);是,更改为char标签[NAMESIZE+1]代码>停止写入sizeof(NAMESIZE)
<代码>命名
是20
sizeof(NAMESIZE)
表示sizeof(20)
,即存储int20
所需的字节数。这是sizeof(int)