CS *_*ent 4 c arrays string pointers strcpy
我的理解如下:
char *指向一个字符串常量,修改它指向的数据是未定义的.但是,您可以更改指向的位置.
char[] 指内存块,您可以更改其内容但不能更改其内容.
strcpy(dest, src)复制src到dest.
我的问题是,这是不正确的使用strcpy()与dest作为一个char * 在已经指向的东西(我beleive旧的内容将被覆盖strcpy()-这是不确定的行为)?
例如:
char *dest = malloc(5);
dest = "FIVE";
char *src = malloc(5);
src = "NEW!";
strcpy(dest, src); /* Invalid because chars at dest are getting overwritten? */
Run Code Online (Sandbox Code Playgroud)
unw*_*ind 11
不幸的是,你的理解并不完全正确.
char *指向字符数据,因为那里没有 const,你可以写入指向的数据.
但是,完全可以这样做:
char *a = "hello";
Run Code Online (Sandbox Code Playgroud)
它为您提供了对只读数据的读/写指针,因为字符串文字存储在只读存储器中,但不会被语言的语法"考虑"为常量.
将上述内容写成:
const char *a = "hello";
Run Code Online (Sandbox Code Playgroud)
更清楚地说明您无法修改指向的数据a.
此外,您的示例混合malloc()和分配是错误的.
这个:
char *dest = malloc(5);
dest = "FIVE"; /* BAD CODE */
Run Code Online (Sandbox Code Playgroud)
是不好的代码,你永远不应该这样做.它只是dest用指向字符串的指针覆盖返回的指针,该字符串"FIVE"存在于(再次,只读)内存中作为字符串文字的位置.
使用字符串数据初始化新分配的内存的正确方法是使用strcpy():
char *dest = malloc(5);
if(dest != NULL)
strcpy(dest, "five");
Run Code Online (Sandbox Code Playgroud)
请注意,检查返回值malloc()是个好主意.
对同一个内存执行多次写操作没有问题,这是C中的一个非常基本的想法; 变量代表存储器,并且可以通过"写入"在不同时间给出不同的值.
简单的事情:
int a = 2;
printf("a=%d\n", a);
a = 4;
printf("a=%d\n", a);
Run Code Online (Sandbox Code Playgroud)
演示了这一点,当然它也适用于字符串,因为它们只是内存块.
您可以扩展上面malloc()的示例:
char *dest = malloc(5);
if(dest != NULL)
{
strcpy(dest, "five");
printf("dest='%s'\n", dest);
strcpy(dest, "four");
printf("dest='%s'\n", dest);
strcpy(dest, "one");
printf("dest='%s'\n", dest);
}
Run Code Online (Sandbox Code Playgroud)
它会打印:
dest='five'
dest='four'
dest='one'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6309 次 |
| 最近记录: |