[英]strcpy function not working properly
請考慮以下代碼。
#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)
可以正常工作。
字符串文字"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
對字符進行計數,直到遇到終止零。 因此,如果字符數組不包含此字符,則該函數的行為未定義。
您的數組不足以容納您要存儲的字符串。
C 中的字符串被定義為以空字符結尾的字符序列,這意味着正確的字符串在末尾有一個空字節。
您的數組可以容納 6 個字節,但您的字符串"rajeev"
需要 7 個字節(6 個用於字母,1 個用於末尾的隱式空字節。因此,您寫的內容超出了數組的末尾。寫在數組調用未定義的行為。
在動態分配內存的情況下,您將再次調用未定義的行為。 在這種情況下,它似乎可以正常工作。 這是未定義行為表現出來的方式之一。
要解決此問題,您的數組需要至少有 7 個元素長:
char a[7], b[7];
a & b 太小,因為 a 就在 b 之后,strcpy 執行后它的第一個字節為零。
malloc 起作用了,因為這塊內存被分配在內存的另一個地方。 但這只是偶然,因為您寫入的內存比分配的內存多。
對未以某種方式分配的內存的任何訪問都是非法的,它是一個 UB。
您定義的數組char a[6], b[6]
沒有足夠的空間來容納您要存儲的字符串。
請記住,C 中的每個數組最后都有一個空字節\\0
。
您可以通過為數組提供足夠的空間來修復它:
char a[7], b[7];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.