c。memcpy()

时间:2017-10-20 14:11:36

标签: c string segmentation-fault memcpy

我有一个带有两个char数组的结构。其中一个数组output_filename[]使用文件名初始化,例如testdata.dat。另一个数组未初始化。

typedef struct _prv_instance_
{
    char output_filename[256];
    char output_filename_serial_log[256];

} prv_instance_t;

在一个函数中,我创建了一个指向这个结构的指针。然后,我想使用output_filename_serial_log[]初始化output_filename[]。 因此,其值为testdata_serial_log.txt,即删除.dat并附加_serial_log.txt

但是,我在memcpy上遇到了段错误?有谁知道为什么?

prv_instance_t * targetP; /*create pointer*/
targetP = (prv_instance_t *)lwm2m_list_find(objectP->instanceList, instanceId); /*assign struct to pointer*/

    /*Create a filename to store the serial output*/
char filename_ending[] = "_serial_log.txt";
printf("output_filename is %s\n", targetP->output_filename);    
printf("The length of output_filename is %d\n",strlen(targetP->output_filename)); 
printf("Number of bytes to be copied is %d\n",strlen(targetP->output_filename));


memcpy(targetP->output_filename_serial_log, targetP->output_filename, (strlen(targetP->output_filename)-4)); /*copy in string minus .dat*/
strcat(targetP->output_filename_serial_log, filename_ending); /*add on the ending*/
printf("The serial filename is %s\n",targetP->output_filename_serial_log);

1 个答案:

答案 0 :(得分:2)

memcpy(dest, src, strlen(src) - 4);

给你一个C风格的字符串,因为你没有空终止它。例如,如果字符串在内存中为xyzzy.txt\0,那么dest最终将只有xyzzy,后跟任意数据。

如果您然后尝试strcatdest,则因为您正在调用未定义的行为,所有投注均已关闭。

你最好用以下的东西:

strcpy(dest, src);
dest[strlen(dest) - 4] = '\0';
stcat(dest, "something");

(假设您可以保证您的字符串长度至少为四个字符)。