[英]memcpy copies array object to character pointer in C but not vice versa
我正在嘗試通過函數將字符從數組復制到字符指針。 以下是我的代碼:
#include<stdio.h>
void pass(void* arg){
char arr[1];
arr[0]='X';
memcpy((char *)arg,arr,1);
}
void main(){
char *buf=malloc(sizeof(char));
pass(buf);
printf("%c",buf);
free(buf);
}
在這里,指針buf打印一個垃圾值。 我嘗試了上述程序的相反操作,如下所示:
#include<stdio.h>
void pass(void* arg){
char arr[1];
memcpy(arr,(char *)arg,1);
printf("%c",arr[0]);
}
void main(){
char *buf=malloc(sizeof(char));
buf[0]='X';
pass(buf);
free(buf);
}
這是成功的,並且arr [0]將值打印為X。有人可以澄清為什么第一種情況失敗了嗎?
你必須打印*buf
或buf[0]
而不是buf
打印由所指向的數組的第一個元件buf
。
還應注意,由於類型不匹配,傳遞的數據將通過printf()
%c
打印具有char*
類型的數據printf()
期望數據具有int
類型)是未定義的行為 。
嘗試這個:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void pass(void* arg){
char arr[1];
arr[0]='X';
memcpy((char *)arg,arr,1);
}
int main(void){
char *buf=malloc(sizeof(char));
pass(buf);
printf("%c",buf[0]);
free(buf);
return 0;
}
您的問題出在這里:
char *buf=malloc(sizeof(char));
:
printf("%c",buf);
因為buf
是指向字符而不是字符的指針 。 字符是*buf
或buf[0]
因此您可以使用以下命令對其進行修復:
printf ("%c", *buf);
arr
memcpy
,在第一個示例中,只要您可以做,就完全沒有必要創建arr
並調用memcpy
:
void pass (void* arg) {
((char*)arg)[0] = 'X';
}
當您可以用以下簡單的方式替換malloc
行時,在這種情況下也無需為字符動態分配內存:
char buf[1];
(當然也要擺脫free
電話)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.