c中的malloc字符串与原始字符串的大小相同

时间:2014-05-04 21:33:23

标签: c string calloc

我的主要功能中有一个字符串。

我需要将它发送到其他函数,并将malloc设置为与原始字符大小相同的新字符串。

我尝试这样的事情:

#define SIZE_STRING 100
typedef char string[SIZE_STRING];

char *testCode(string str)
{   
    char *new_str;
    int limit = strlen(str);
    int new_limit;
    new_str = (char*)calloc(limit, sizeof(char));
    new_limit = strlen(new_str);
    printf("%d", new_limit);

    return new_str;
}

void main()
{
    char str[SIZE_STRING] = { "BLA BLA BLA" };
    char *new_str;
    new_str=testCode(str);
}

new_limit的大小为0。

我该怎么办?

3 个答案:

答案 0 :(得分:1)

变化:

 new_str = (char*)calloc(limit, sizeof(char));

new_str = malloc(limit + 1);
strcpy(new_str, str);

你从未将旧字符串复制到刚刚创建的缓冲区中,所以当你对其进行strlen时,你当然会得到零。

答案 1 :(得分:0)

对于c中与原始字符串大小相同的malloc()字符串,必须为函数“testCode”提供一个额外的信息项。即,原始字符串的大小。

#define SIZE_STRING 100
typedef char string[SIZE_STRING];

char *testCode(string str, size_t strSize)

在'testCode'的参数中添加'strSize'(上面)以提供'str'的实际大小。

   {   
   char *new_str;
// int limit = strlen(str);
// int new_limit;
   new_str = (char*)calloc(strSize, sizeof(char));

为'strSize'交换'limit'以分配正确的大小。

   new_limit = strSize;

为'strSize'交换'strlen(new_str)'。前一个术语'strlen(new_str)'将始终为零,因为calloc()'将新内存归零'功能。

   printf("%d", new_limit);

  return new_str;
  }

void main()
   {
   char str[SIZE_STRING] = { "BLA BLA BLA" };
   char *new_str;
   new_str=testCode(str, sizeof(str));
  }

最后的想法......

问题是如何“在c中使用与原始字符串相同大小的malloc字符串”。请记住,字符数组的“大小”与字符数组的“长度”不同。虽然数组的“大小”定义为构成整个数组的字节数(或可能是元素),但C字符串的“长度”是在数组中找到的字符数,直到终止'\ 0'字符。

因此,如果问题实际上是如何“在c中使用相同长度原始字符串的malloc字符串”,则上述答案仍然适用,但该行除外:

new_str=testCode(str, sizeof(str));

必须更改为:

new_str=testCode(str, strlen(str)+1);

答案 2 :(得分:0)

你的意思是你被赋予了重新实现strdup()libc函数的任务吗?

https://sourceware.org/git/?p=glibc.git;a=blob;f=string/strdup.c;h=cedffa0da2e7a94ea8b95e79af6a7a5d0d3236d9;hb=HEAD#l37