请考虑以下代码。
#include<stdio.h>
#include<string.h>
void main()
{
char a[6], b[6];
strcpy(a,"rajeev");
printf("print A:");
for(int i=0;i<strlen(a);i++)
{
printf("%c",a[i]);
}
strcpy(b,a);
printf("print B:");
for(int i=0;i<strlen(b);i++)
{
printf("%c",b[i]);
}
printf("trying to print A again");
for(int i=0;i<strlen(a);i++)
{
printf("%c",a[i]);
}
在运行此程序时,在“尝试再次打印A”部分中不打印任何内容,strlen(a)
将为0.这意味着源数组将为空。
你能帮我理解这背后的现象吗?
但是,将a[6]
的声明更改为char* a=malloc(6)
可以正常工作。
答案 0 :(得分:4)
字符串文字"rajeev"
的类型为char [7]。也就是说,它具有静态存储持续时间,并存储为初始化为
char unnamed[] = { 'r', 'a', 'j', 'e', 'e', 'v', '\0' };
因此,如果要使用函数strcpy
将其内容复制为字符串,则需要在目标数组中提供足够的内存。例如
char a[7], b[7];
strcpy(a,"rajeev");
printf("print A:");
for ( size_t i = 0, n = strlen( a ); i < n; i++ )
{
printf("%c",a[i]);
}
//... and so on
考虑到函数strlen
计算字符直到遇到终止零。因此,如果字符数组不包含此字符,则函数的行为未定义。
答案 1 :(得分:2)
您的数组不足以容纳您尝试存储的字符串。
C中的字符串被定义为空终止的字符序列,这意味着正确的字符串在末尾有一个空字节。
你的数组可以容纳6个字节,但你的字符串char a[7], b[7];
需要7个字节(字母为6个字节,最后一个字节为隐式空字节。因此,你写过数组的末尾。在数组边界外写入会调用undefined behavior。
在您动态分配内存的情况下,您将再次调用未定义的行为。在这种情况下,出现才能正常工作。这是未定义行为可以表现出来的方式之一。
要解决此问题,您的数组需要至少7个元素:
android:path
答案 2 :(得分:0)
a&amp; b太小了,因为a刚好在b之后,strcpy执行后它的第一个字节为零。
malloc之所以有效,是因为这块内存是在内存中的其他位置分配的。但这只是偶然的,因为你写的内存比你分配的内存多。
任何以某种方式分配的内存访问都是非法的,而且是UB。
答案 3 :(得分:0)
您定义的数组char a[6], b[6]
没有足够的空间来容纳您要存储的字符串。
请记住,C语言中的每个数组末尾都有一个空字节\0
。
您可以通过为数组提供足够的空间来修复它:
char a[7], b[7];