结构内部字符串的strcpy()-未定义



我定义了一个类似于以下的结构:

struct csv_headers {
char field1[256];
char field2[256];
};

然后在我的代码后面我有:

struct csv_headers fields;
strcpy(fields.field1, str_ary[0]);
strcpy(fields.field2, str_ary[1]);

其中str_ary[n]是某个字符串。

这是否会像下面的代码一样导致未定义的行为?

char str[] = "some text";
strcpy(str, "text");

既然strcpy不应该用于字符串文字?

如果是,将字符串复制到结构内部声明的字符串中的可接受方法是什么?上面的代码示例使用-Wextra编译时没有任何警告(假设我键入的代码正确——我现在没有代码(。

我知道使用strcpy的潜在危险,不想在这里讨论,这只是为了说明目的。我只想知道将字符串复制到包含字符串的结构中的可接受方法。

这是否会像下面的代码一样导致未定义的行为?

char str[] = "some text";
strcpy(str, "text");

既然strcpy不应该用于字符串文字?

str不是字符串文字,它是一个char[10](通过从字符串文字复制数据进行初始化(,它是strcpy的有效目标。此代码不会导致未定义的行为;它定义明确且有效。

同样,示例中的fields.field1fields.field2是常规的char[]。它们是结构的成员在本文中并不重要。

但是,请确保是有效的:str_ary[0]看起来很可疑,除非str_ary是以零结尾的字符串的数组,即类似char[][]的数组。


1从字符串文字初始化字符串数组就像通过strcpy一样,即它几乎与写入完全相同

char str[sizeof("some text")];
strcpy(str, "some text");

事实上,编译器可以(至少在某些情况下do(为这种初始化生成与直接赋值相同的代码。相比之下,char *str = "some text";不执行复制,这里str是指向字符串文字的指针,因此是只读的,而不是strcpy的有效目标。

这是否会像下面的代码一样导致未定义的行为?

好吧,您的代码片段不会引起问题。

char str1[] = "foo"; // str1 is a regular array initialized to "foo"
char *str2 = "bar"   // str2 is a pointer, pointing to a string literal
strcpy(str1, "FOO"); // Ok
strcpy(str2, "BAR"); // Undefined behavior

只要字符串适合目标空间,即使是

char str[] = "some text";
strcpy(str, "text");

定义明确。

char field1[256];声明了一个可容纳256个字符的数组。这允许您存储最多255个字符的以null结尾的字符串(数组大小,减去null终止符的一个(。

CCD_ 17另外初始化数组以包含字符串CCD_。您仍然可以将最多255个字符的字符串复制到数组中,因为这就是空间的大小

CCD_ 19与CCD_。有了空括号,str仍然是一个字符数组。空括号的意思是数组的大小(通常放在括号内的大小(是自动确定的。与包含大小的方括号相比,没有其他区别。对于字符数组,大小是字符串的长度加上null终止符的一。

在所有涉及数组的情况下,用于初始化数组的字符串(如果有(都存储在数组本身中。它不能以任何其他方式访问,如果您更改数组,用于初始化它的字符串将不再存在于内存中(至少在没有办法找到它的意义上——不能保证它不会存在于内存转储中,但您无法从程序中访问它(。

临界差异不在char str[10]char str[]之间,而在char str[…]char *p之间。使用*而不是方括号,char *p声明的是指针,而不是数组。

char *p = "some text";

做两件事。一件事是,它安排将字符串文本"some text"存储在整个程序期间都可以访问的地方。另一件事是,它声明了一个指向这个字符串文字的变量p。您无法修改存储"some text"的内存(实际上,在许多平台上,它都在只读内存中(。另一方面,您可以使其他内容指向该内存,也可以将p更改为指向其他内容。

char *p = "some text";
char *q;
puts(p); // prints "some text"
q = p;
p = "hello";
puts(q); // prints "some text"
puts(p); '// prints "hello"

相关内容

  • 没有找到相关文章

最新更新