#include<stdio.h>
#include<string.h>
void* swap(void* x, void* y, int size)
{
char* buffer[size];
memcpy(buffer,x,size);
memcpy(x,y,size);
memcpy(y,buffer,size);
}
int main()
{
char* wife = strdup("Wilma Deloitte");
char* husband = strdup("Fred");
printf("\n wife : %s husband : %s \n",wife,husband);
swap(wife,husband,sizeof(char*));
printf("\nAfter swap: \nwife : %s husband : %s \n",wife,husband);
printf("\n sieof : %d \n",(int)sizeof(char*));
return 0;
}
输出:
wife : Wilma Deloitte husband : Fred
交换后:
wife : Fred husband : Wilma De
sieof : 8
如果我通过&amp; wife和&amp;丈夫,那么丈夫和妻子内部的地址会被交换,因此我得到了正确的输出与fred和wilma deloitte字符串交换..因为妻子和丈夫的字符串指着fred和wilma deloitte的地址...
我已通过丈夫和妻子内部的地址通过memcpy交换..我想在fred和wilma deloitte之间交换5个字母(因为“fred \ 0”是5个字符)..所以以上输出必须是Fred Deloitte和Wilma ..为什么输出不如预期..
答案 0 :(得分:4)
您正在交换由sizeof(char*)
确定的字节数。
在您的平台上,sizeof(char*)
,实际上, ANY 指针的大小始终为8个字节。
sizeof
不是测量字符串的工具。如果您要测量字符串的长度,则应使用strlen
,而不是sizeof
如果您只想换掉他们的名字,请试试这个:
swap(wife,husband,sizeof(husband)+1); // Swap 5 characters
void* swap(void* x, void* y, int size)
{
char buffer[size];
memcpy(buffer,x,size); // Buffer is now "Wilma " (no NULL-terminator)
memcpy(x,y,size); // x is now "Fred Deloitte"
memcpy(y,buffer,size); // y is now "Wilma" (no NULL-terminator)
}
注意关于NULL终止符的注释 它更好,但并不完美。
如果您打算交换整个文本,请认识到wife
包含15个字符,但husband
仅包含5个字符。您如何建议将15个字符的数据填充为5个字符的数组?
如果您使用字符串,我建议使用与字符串相关的函数:strlen
,strcpy
,strcat
,而不是mem
- 函数
答案 1 :(得分:3)
改变这个:
char* buffer[size];
对此:
char buffer[size];
并改变这一点:
swap(wife,husband,sizeof(char*));
对此:
swap(&wife,&husband,sizeof(char*));
答案 2 :(得分:1)
swap(wife,husband,sizeof(char*));
当您发送sizeof(char*)
作为大小时,它会创建4
大小的缓冲区,这就是为什么只交换了四个chars
的原因。
应该如下:
int size = strlen(wife)>strlen(husband) ? strlen(wife) : strlen(husband);
swap(wife,husband, size);
# maximum size
答案 3 :(得分:1)
最重要的是,我认为您的意图是将一个 动态分配的 字符串的内容与另一个动态分配的字符串的内容进行交换。那是错的。在示例程序中,您尝试将15字节字符串(&#34; Wilma Deloitte \ 0&#34;)复制到5字节strdup()
/ malloc()
ed字符串(包含内存) &#34;佛瑞德\ 0&#34)。一旦你解决了其他人提到的问题,你仍然会遇到 破坏内存堆 的问题(取决于malloc()
实现)。