我有一个带有两个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);
答案 0 :(得分:2)
memcpy(dest, src, strlen(src) - 4);
将不给你一个C风格的字符串,因为你没有空终止它。例如,如果字符串在内存中为xyzzy.txt\0
,那么dest
最终将只有xyzzy
,后跟任意数据。
如果您然后尝试strcat
到dest
,则因为您正在调用未定义的行为,所有投注均已关闭。
你最好用以下的东西:
strcpy(dest, src);
dest[strlen(dest) - 4] = '\0';
stcat(dest, "something");
(假设您可以保证您的字符串长度至少为四个字符)。