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)
,即存储int
20
所需的字节数。它是
sizeof(int)
,在通用系统上是4或8。有没有办法在结构本身中为标签字符串文本保留空间?类似于:char*label=malloc(sizeof(NAMESIZE)+1);是,更改为
char标签[NAMESIZE+1]停止写入
sizeof(NAMESIZE)
<代码>命名
20
sizeof(NAMESIZE)
表示
sizeof(20)
,即存储int
20
所需的字节数。这是
sizeof(int)