簡體   English   中英

memcpy清除C中char數組中的變量

[英]memcpy erase variables in char array in C

我創建了多個dimensioanl數組並將其寫入控制台

char a[5][10];

strcpy(a[0], "111111");
strcpy(a[1], "211112");
strcpy(a[2], "311113");
strcpy(a[3], "411114");
strcpy(a[4], "511115");


printf("size : %d \n", sizeof(a));

int i;
for(i = 0; i < 5; i++)
{
    printf("%d : %s \n",i,a[i]);
}

結果是

size : 50 
0 : 111111 
1 : 211112 
2 : 311113 
3 : 411114 
4 : 511115 

然后我將陣列復制到另一個陣列,並將它們都寫入控制台

char a[5][10];
char b[][10]={"0"};

strcpy(a[0], "111111");
strcpy(a[1], "211112");
strcpy(a[2], "311113");
strcpy(a[3], "411114");
strcpy(a[4], "511115");

memcpy(&b,&a,sizeof(a));

printf("sizeof(a) : %d \n", sizeof(a));
int i;
for(i = 0; i < 5; i++)
{
    printf("%d : %s \n",i,a[i]);
}

printf("sizeof(b) : %d \n", sizeof(b));
for(i = 0; i < 5; i++)
{
    printf("%d : %s \n",i,b[i]);
}

結果是:

sizeof(a) : 50 
0 :  
1 :  
2 :  
3 :  
4 : 511115 
sizeof(b) : 10 
0 : 111111 
1 : 211112 
2 : 311113 
3 : 411114 
4 : 511115 

數組中發生了什么變量? 為什么數組的內容為空? 我使用Ubuntu 14.04 ,gcc版本是(Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4

的大小b是太小,無法存儲的所有內容a ,讓你訪問的分配的內存,這是非常危險的了。

請分配足夠的內存。

char a[5][10];
char b[5][10]={{"0"}}; /* change this line */

strcpy(a[0], "111111");
strcpy(a[1], "211112");
strcpy(a[2], "311113");
strcpy(a[3], "411114");
strcpy(a[4], "511115");

memcpy(&b,&a,sizeof(a));

printf("sizeof(a) : %d \n", (int)sizeof(a)); /* change this line to pass data having correct type */
int i;
for(i = 0; i < 5; i++)
{
    printf("%d : %s \n",i,a[i]);
}

printf("sizeof(b) : %d \n", (int)sizeof(b)); /* change this line to pass data having correct value */
for(i = 0; i < 5; i++)
{
    printf("%d : %s \n",i,b[i]);
}

此代碼可以示出為什么在內容a似乎刪除:0×00寫入a[i][0]printf()解釋它們作為字符串的結尾。

#include <stdio.h>

int main(void) {
    char a[5][10];
    char b[][10]={"0"};

    strcpy(a[0], "111111");
    strcpy(a[1], "211112");
    strcpy(a[2], "311113");
    strcpy(a[3], "411114");
    strcpy(a[4], "511115");

    memcpy(&b,&a,sizeof(a));

    int i, j;
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 10; j++) printf("%02X ", (unsigned int)(unsigned char)a[i][j]);
        putchar('\n');
    }

    return 0;
}

memcpy覆蓋了數組a的內容。 為什么這樣做呢?

數組b僅分配了10個字節,因為char b[][10]意思是“為10個字符的字符串數組分配空間,字符串的數量由初始化程序指定。” 在您的情況下,初始值設定項為“ 0”,即一個字符串。 因此,它為一個10個字符的字符串分配了空間。

由於整個內容都在堆棧上,因此布局是相反的。 因此,b的位置首先出現,然后是a。

因此,當您寫入b時,它將正確啟動,並寫入第一個字符串。 當您寫入第二個字符串時,它將溢出到數組a的空間中並殺死它。 4次。 最后一個字符串保留下來。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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