我有如下功能:
char * function(char a)
{
char data[5];
char *hData;
sprintf(data,"%02X",a);
data[5] = '\0';
hData = data;
return hData;
}
所以基本上是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
答案 0 :(得分:1)
如果要返回字符串,则必须使用动态内存分配。像:
str_shuffle()
发布的代码返回指向局部变量的指针(即<?php
$string = "123456789AaBbCcDdEeFfGgHhIiJjKkLlMmNnPpQqRrSsTtWwXxYyZz"; //You can use any string
$key_len = "5";
$string_shuffle = str_shuffle($string);
$session_key = str_shuffle(substr($string_shuffle, 3, $key_len));
?>
<input type="text" name="name1" value="<?php echo $session_key;?>">
)。这是无效的,因为一旦函数返回,局部变量超出范围(即不再存在)。因此,您需要使用#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
分配的内存有效,直到您明确释放它为止。
答案 1 :(得分:1)
您的代码有几个错误:
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()
}
答案 2 :(得分:-1)
您不需要返回字符串,因为默认情况下,字符串在C中通过引用传递。您在函数内所做的更改将影响实际的字符串。