简单的memcpy似乎不起作用

时间:2012-12-20 02:05:24

标签: c pointers memory memcpy

我正在尝试做一个简单的memcpy,如下所示。

char *token[32];
char *temp_store[4];

for (i = 0 ; i < 4; i++)
{
   memcpy(token[4+i],temp_store[i],strlen(temp_store[i]));
}

我在令牌数组中有以下值。

temp_store[0] = "5";
temp_store[1] = "6";
temp_store[2] = "7";
temp_store[3] = "8";

我希望将这4个值"5" , "6", "7", "8"分别复制到token[4],token[5],token[6] and token[7]

但是由于某种原因,我没有在token []中获取这些值。我无法弄清楚为什么会这样。

3 个答案:

答案 0 :(得分:3)

首先,如果要使用memcpy函数复制C字符串,则必须复制strlen() + 1个字节以包含零终止符。或者您必须自己添加终止零到目标阵列。没有终止零,它不是一个字符串。

其次,复制零终止字符串实际上是strcpy函数的作用。为什么选择使用memcpy

第三,如果你真的想复制源字符串,你还记得在执行复制之前分配目标内存吗?告诉我们你如何分配它。到目前为止您发布的代码没有分配该内存,这意味着您的memcpy调用将数据“复制到了无处”,导致未定义的行为通常会导致崩溃。

第四,您确定要复制这些字符串,而不是简单地将token[]元素指向相同的内存位置吗?后者可以通过简单的

来实现
token[4+i] = temp_store[i];

这种方法是否适用于您的情况取决于您要做的事情。

答案 1 :(得分:2)

temp_store [0],temp_store [1],temp_store [2],temp_store [3]中的每一个都是一个指向char数组的指针。 您需要确保这四个char数组是空的。

strlen()用于确定空结束字符串的长度

将多个数组内容放入更大数组的另一种方法是使用memcpy,如下所示:

#include <stdio.h>
#include <string.h>

int main()
{
    const int LEN = 10 ;
    const int NUM_STRING = 4 ;
    char token[NUM_STRING*LEN+1]={0};
    char temp_store[NUM_STRING][LEN] = { {0} };

    for (int i = 0 ; i < NUM_STRING; i++) {
        memcpy(token+LEN*i, temp_store[i], sizeof(temp_store[i]));
    }
    return 0;
}

这会将整个temp_store [0],temp_store [1],temp_store [2],temp_store [3]复制到令牌

(这意味着temp_store [4] [10]中的所有10 * 4个字符)

答案 2 :(得分:1)

我不确定你要做什么。但是,如果你只是想连接一个字符串,memcpy就不是了。使用strcat,如下所示:

for (i = 0; i < n; i++) {
    strcat(token[i+4], temp_store[i]);
}

如果要进行字符串操作,请使用空终止字符串和str *函数。 C支持这些,你需要的许多字符串操作(连接,长度,重复和分配,比较)都在套件中,而且使用它们比mem *函数更简单。