【问题标题】:How to properly receive string from a function in c如何从c中的函数正确接收字符串
【发布时间】:2017-10-20 07:54:15
【问题描述】:

我有如下功能:

char * function(char a)
{
  char data[5];
  char *hData;
  sprintf(data,"%02X",a);
  data[5] = '\0';
  hData = data;
  return hData;
}

所以基本上 a 是 170,我需要将其转换为等效的十六进制 AA 并返回它。在 sprintf 之后它被转换为 AA 但我无法返回数组,所以我将它保存到字符串 hData 然后返回它。 hData 在返回时包含 AA

在我的主要功能中,我收到如下:

char *hex;
hex = function(buf[0]);  //This line gives warning

十六进制包含数据AA,但为什么它会发出警告。

警告说:

assignment makes pointer from integer without a cast

【问题讨论】:

  • 您在函数中返回指向局部变量 (data) 的指针。函数返回后 - 它将低于堆栈指针。因为结果可以随时修改(或在第一次调用另一个函数之后)。这当然是错误的。最好的 - 你需要传递指向字符串的指针作为参数。所以在调用函数中分配字符串。作为替代方案,您需要从堆或函数中的另一个存储中分配字符串,以便返回它。但返回堆栈中局部变量的地址 - 这是错误
  • 错误信息表明你在调用它之前没有声明function()。这是 C99 或更高版本中的编译错误 - 您必须在 C90 模式下使用编译器(这是允许的,但编译器假定未声明的函数返回 int - 当函数返回指针时会导致错误)。

标签: c string


【解决方案1】:

如果你想返回一个字符串,你必须使用动态内存分配。喜欢:

#include<stdio.h>
#include <stdlib.h>

char * function(char a)
{
  char *hData = malloc(5);  // Allocate memory

  // Use hData just as if it was declared like hData[5]
  sprintf(hData, "%02X", a);
  hData[3] = 0;

  return hData;  // Return a pointer to the allocated memory
}

int main() 
{
    // Use it like
    char* s = function('a');
    printf("%s\n", s);
    free(s);
    return 0;
}

发布的代码返回一个指向局部变量的指针(即data)。这是无效的,因为一旦函数返回,局部变量就会超出范围(即不再存在)。因此,您需要使用malloc,因为使用malloc 分配的内存在您明确释放它之前是有效的。

【讨论】:

  • 它仍然给出警告初始化使指针从整数而不进行强制转换
  • 你包含stdlib.h 吗?喜欢:#include &lt;stdlib.h&gt;
  • 我正在用 gcc 编译。 (ubuntu)
  • @Doe:我已经更新了答案以显示我的所有代码。我编译它:gcc -Wall code.c 我没有收到任何警告。
  • @Doe:你可以试试char *hData = (char*)malloc(5);,但这应该没有是必要的(有人说这是一个坏习惯)。
【解决方案2】:

您的代码有几个错误:

  • 您正在返回一个指向data 数组的指针,它是函数中的一个局部变量。函数返回后,取消引用该指针不再有效。 (它可能似乎工作,但它也可能使您的程序崩溃或导致它以后行为不端。)您需要使用 malloc 来分配不是函数本地的内存。李>
  • 您正在分配给data[5],但数组只上升到data[4]。 (请记住,数组是从零开始的,因此最高数组索引比大小小一。)

这是一个应该可以正常工作的版本:

char * function(char a)
{
  char *data = malloc(3);  // 2 for the hex digits, plus 1 for the null
  sprintf(data, "%02X", a);
  data[2] = '\0';
  return data;
}

调用此函数后,您需要在完成后释放字符串。这是一个示例main 函数:

int main()
{
  char *str = function('a');
  printf("Test: %s\n", str);
  free(str);  // Release the memory allocated by malloc()
}

【讨论】:

  • 它仍然给出同样的警告!
  • 编译时没有。我已经编辑了答案以显示我使用的 main() 函数。
【解决方案3】:

您不需要返回字符串,因为默认情况下,字符串在 C 中是通过引用传递的。您在函数内部所做的更改将影响实际的字符串。

【讨论】:

  • C中没有引用传递
  • 而且函数外没有字符串。它正在修改 data 数组,该数组仅在函数运行时存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
  • 2021-07-17
  • 1970-01-01
  • 2019-12-30
相关资源
最近更新 更多