为什么cstdlib strncpy在将char数组复制到字符指针时崩溃

时间:2014-04-21 14:59:05

标签: c string

这是我的代码:

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总是崩溃。

我做错了什么?

3 个答案:

答案 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, &copy);
if(rCode)
   {
   fprintf(stderr, "ToC() reports error: %d\n", rCode);
   ...
   }

...

if(copy)
   free(copy);

...
}