簡體   English   中英

strcpy 功能無法正常工作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM