我有以下代碼。我試圖將一個結構複製到一個字符串。我想了解爲什麼輸出在strncpy和memcpy之間變化。用於結構複製的memcpy和strncpy的區別
#include <stdio.h>
#include<string.h>
struct a{
int len;
int type;
};
int main(){
struct a aa={98,88};
char str[10]="";
char str2[10]="";
strncpy(str,&aa,sizeof(struct a));
memcpy(str2,&aa,sizeof(struct a));
for(int i=0;i<10;i++)printf("%2d",str[i]);
printf("\n");
for(int i=0;i<10;i++)printf("%2d",str2[i]);
return 0;
}
下面是輸出:
98 0 0 0 0 0 0 0 0 0
98 0 0 088 0 0 0 0 0
我明白strncpy()函數將複製直到遇到 '\ 0'(或大小限),但我沒有 '\ 0' 值在結構中。有人可以幫助我理解這一點。 這樣做的目的:試圖通過網絡發送結構。雖然我打算實現系列化,我想了解的行爲
編輯: 1)由基思·湯普森
建議下面是生成警告。
incompatible pointer types passing 'struct a *' to parameter of type 'const char *' [-Wincompatible-pointer-types]
2)I修改代碼中的位,以使用int數組:
(把此供參考我明白,在這種情況下,memcpy的拷貝結構體中的前兩個元素的變量。陣列的大小是足夠的結構變量)
#include <stdio.h>
#include<string.h>
struct a{
int len;
int type;
};
int main(){
struct a aa={98,88};
int str[10]={0};
int str2[10]={0};
strncpy(str,&aa,sizeof(struct a));
memcpy(str2,&aa,sizeof(struct a));
for(int i=0;i<10;i++)printf("%2d",str[i]);
printf("\n");
for(int i=0;i<10;i++)printf("%2d",str2[i]);
return 0;
}
下面是鄰\號碼:
98 0 0 0 0 0 0 0 0 0
9888 0 0 0 0 0 0 0 0
下面生成的警告:
incompatible pointer types passing 'int [10]' to parameter of type 'char *' [-Wincompatible-pointer-types]
incompatible pointer types passing 'struct a *' to parameter of type 'const char *' [-Wincompatible-pointer-types]
您的結構不是字符串。 'strncpy'對字符串進行操作。這個電話甚至不應該編譯;你至少應該得到一個'struct a *'參數傳遞給'strncpy'的警告,它需要'char *'。即使對於字符串,通常也應該避免使用「strncpy」。 [見我在這裏主題的咆哮](http://the-flat-trantor-society.blogspot.com/2012/03/no-strncpy-is-not-safer-strcpy.html)。 – 2014-12-01 20:08:26
它的確發出了警告。 – mayur 2014-12-02 10:49:19
請更新您的問題以顯示確切的警告;這是非常重要的信息。 – 2014-12-02 14:54:12