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