我正在尝试创建一个xoring函数(我想要XOR 2字符串并返回结果)。
为此,我需要将数组(str [])的内容复制到字符串(str *)。
char* xor(char* str1, char* str2)
{
char temp[strlen(str1)];
char* result = NULL;
int i;
for(i=0; i<=strlen(str1); i++)
{
temp[i] = str1[i] ^ str2[i];
}
memcpy(result,temp,sizeof(temp)+1);
return result;
}
我的memcpy收到了一个段错误。
我错过了什么吗?你能救我吗?
答案 0 :(得分:2)
您没有为result
分配内存,而您已将NULL
传递给memcpy()
;这是未定义的行为。
#include <stdlib.h>
#include <string.h>
char *xor(char const *a, char const *b) {
size_t const size = strlen(a);
if (size != strlen(b)) {
return NULL;
}
char *result = malloc(size + 1);
if (!result) {
return NULL;
}
for (size_t i = 0; i < size; i++) {
result[i] = a[i] ^ b[i];
}
result[size] = '\0';
return result;
}
答案 1 :(得分:1)
您应该将数组声明为minimum length of 2 strings+1
。否则您可以在访问str1
和str2
时访问数组索引。
for(i=0; i< min( strlen(str1) , strlen(str2) ) ; i++)
{
temp[i] = str1[i] ^ str2[i];
}
temp[i]='\0';
您正在访问一个比您应该更多的索引元素。这是您获得分段错误的地方。
你也没有在result
中分配任何东西。解决方案就像是
result = malloc(sizeof(temp));
memcpy()
尝试复制到未指向内存的任何有效确定部分的内存,从而导致未定义的行为。
size_t min(size_t x, size_t y){
return x<y?x:y;
}
char* xor(char* str1, char* str2)
{
char temp[min(strlen(str1),strlen(str2))+1];
char* result = malloc(sizeof temp);
if( result == NULL){
fprintf(stderr, "%s\n", "Error in malloc");
exit(1);
}
size_t i;
for( i = 0; i <= strlen(str1); i++)
temp[i] = str1[i] ^ str2[i];
temp[i] = '\0';
memcpy(result,temp,sizeof(temp));
return result;
}
总结问题是 -
访问数组索引越界。
将未初始化的指针传递给memcpy
。
当两个字符串的字符串长度不同时,也会留下未定义行为的范围。
现在的问题是这个过程的目的是什么。我们可能会遇到不可打印的字符等等,从通常的字符串操作的角度来看,这些字符没什么用。
您对问题的标题是Memcpy a str[ ] to str*
。现在你的意思是Memcpy a char[ ] to char*
。
事情是char*
保存一些内存的地址。那么当我们复制到哪里复制? char*
指向的内存地址。而你的情况只是一个不确定的未初始化的价值。你在那里复制 - 那是UB。
答案 2 :(得分:1)
您应使用result
或malloc
为calloc
分配空间。目前,result
为NULL
。因此,段错误。
此外,您不应在sizeof(temp)+1
的通话中使用memcpy
。您正在调用UB。您试图访问超出已分配给temp
的字节的一个字节。那是错的。
答案 3 :(得分:1)
考虑到所有评论,我相信你的功能应该是:
char* xor(char* str1, char* str2)
{
int len= strlen(str1)
char temp[len];
if (strlen(str2) != len) return 0;
char *result = malloc(len);
for(int i=0; i<len; i++)
{
temp[i] = str1[i] ^ str2[i];
}
memcpy(result,temp,len);
return result;
}
可以简化为:
char* xor(char* str1, char* str2)
{
int len= strlen(str1)
if (strlen(str2) != len) return 0;
char *result = malloc(len);
for(int i=0; i<len; i++)
{
result[i] = str1[i] ^ str2[i];
}
return result;
}