Memcpy a str [] to str *

时间:2017-12-07 14:55:27

标签: c arrays string copy

我正在尝试创建一个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收到了一个段错误。

我错过了什么吗?你能救我吗?

4 个答案:

答案 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。否则您可以在访问str1str2时访问数组索引

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)

您应使用resultmalloccalloc分配空间。目前,resultNULL。因此,段错误。

此外,您不应在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;
}