这是我的代码:
char* ToC(char src[STRING_SIZE], char* dest)
{
if ( src[0] == 0 )
dest = NULL;
else
strncpy(dest, &src[0], size_t(strlen(src)));
}
如何调用它:
typedef struct sdata
{
char* point_one;
}tsdata
tsdata sdata;
char name[STRING_SIZE] = "point_data";
ToC(name, sdata.point_one);
strncpy总是崩溃。
我做错了什么?
答案 0 :(得分:2)
此代码:
typedef struct sdata
{
char* point_one;
}tsdata
tsdata sdata;
char name[STRING_SIZE] = "point_data";
ToC(name, sdata.point_one);
使用第二个参数调用Toc
一个未初始化的指针,该值由值传递。
不确定值用作目标指针。
→崩溃,或更普遍的未定义行为。
一般评论。
在此函数声明中,
void ToC(char src[STRING_SIZE], char* dest)
STRING_SIZE
,并且不能使用以下代码。在此代码段中:
if ( src[0] == 0 )
dest = NULL;
此外,对于更新的问题,其中函数声明已更改为
char* ToC(char src[STRING_SIZE], char* dest)
return
语句,因此对函数结果的任何使用都是未定义的行为。答案 1 :(得分:1)
tsdata sdata;
char name[STRING_SIZE] = "point_data";
ToC(name, sdata.point_one);
您尚未为sdata.point_one
指针分配任何空格。
tsdata sdata
静态分配等于sizeof(sdata)
的内存,实际上只是指针point_one
的大小。
您应该将内存分配给point_one
sdata.point_one = malloc(sizeof(name));
或其他大小。
答案 2 :(得分:1)
这是一种可能的解决方案。它分配一块适合存储“src”副本的内存块,并复制“src”和“src”。到该内存,并设置调用者提供的指向已分配内存的指针。 (它返回一个非零值表示失败):
#include <string.h> // strdup();
#include <errno.h> // ENOMEM
int ToC(
char *I__src,
char **_O_dest
)
{
int rCode=0;
char *dest = NULL;
if(0 == I__src[0])
*_O_dest = NULL;
else
{
*_O_dest=strdup(I__src);
if(NULL == *_O_dest)
rCode = ENOMEM;
}
return(rCode);
}
上面的函数将被称为:
{
...
int rCode = 0;
char *anyLengthString = "The brother of Jared";
char *copy = NULL;
...
rCode=ToC(anyLengthString, ©);
if(rCode)
{
fprintf(stderr, "ToC() reports error: %d\n", rCode);
...
}
...
if(copy)
free(copy);
...
}