我的怀疑如下:
1:如何从函数'fun'发送'str',以便我可以在主函数中显示。
2:返回类型在代码中是否正确?
2:当前代码正在显示一些不同的输出。
char * fun(int *arr)
{
char *str[5];
int i;
for(i=0;i<5;i++)
{
char c[sizeof(int)] ;
sprintf(c,"%d",arr[i]);
str[i] = malloc(sizeof(c));
strcpy(str[i],c);
}
return str;
}
int main()
{
int arr[] = {2,1,3,4,5},i;
char *str = fun(arr);
for(i=0;i<5;i++)
{
printf("%c",str[i]);
}
return 0;
}
如何从函数'有趣的'发送'str',以便我可以在主函数中显示。
这就是方式:
char* str = malloc( size );
if( str == NULL ) {
fprintf( stderr,"Failed to mallocn");
}
/* Do stuff with str, use str[index],
* remember to free it in main*/
free(str);
,返回类型在代码中是否正确?
不,可能是您需要返回的char **。
当前代码正在显示一些不同的输出。
考虑解释您要做什么/为什么要做?您写的方式似乎完全弄乱了我。您正在传递整数数组,但不会长度。乐趣()应该如何知道数组的长度?另一个问题是Fun中的一系列指针。
您不能将int写成char(请参阅两个大小)。因此,我改用char数组。但是,我不确定这是否是您想做的(可能是一种快速而肮脏的方式):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char**
fun(int *arr, int size)
{
char **str = malloc( sizeof(char*)*size );
if( str == NULL ) {
fprintf( stderr, "Failed mallocn");
}
int i;
for(i=0;i<5;i++) {
str[i] = malloc(sizeof(int));
if( str == NULL ) {
fprintf( stderr, "Failed mallocn");
}
sprintf(str[i],"%d",arr[i]);
}
return str;
}
int
main()
{
int arr[] = {2,1,3,4,5},i;
char **str = fun(arr, 5);
for(i=0;i<5;i++) {
printf("%sn",str[i]);
free(str[i]);
}
free(str);
return 0;
}
我对您的代码进行了这些更改以使其正常工作:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char **fun(int *arr)
{
char **str = malloc(sizeof(char *) * 5);
int i;
for(i = 0; i < 5; i++) {
if ((arr[i] >= 0) && (arr[i] <= 9)) {
char c[2] ;
sprintf(c, "%d", arr[i]);
str[i] = (char *) malloc(strlen(c) + 1);
strcpy(str[i],c);
}
}
return str;
}
int main()
{
int arr[] = {2, 1, 3, 4, 5}, i;
char **str = fun(arr);
for(i = 0; i < 5; i++) {
printf("%s", str[i]);
free(str[i]);
}
printf("n");
free(str);
return 0;
}
输出
21345
我添加了一张检查,以确保arr[i]
是一个数字号码。此外,将指针返回堆栈变量将导致不确定的行为,因此我更改了代码以分配一系列字符串。我不检查malloc
调用的返回值,这意味着由于NULL
指针参考。
此解决方案与其他解决方案不同,因为它试图根据预期的用法来回答您的问题。
如何从函数'有趣的'发送'str',以便我可以在主函数中显示。
首先,您需要定义一个将指针返回数组的函数。
char (*fun(int arr[]))[]
分配可变长度字符串不会给您任何东西。64位未签名的INT所需的最长字符串是20位数字。您需要的只是分配5个元素的数组,分别为2个字符。您可以调整长度以适合您的需求。该样本假定1位数字和1个无效字符。注意分配仅完成一次。您可以选择使用21个长度(20位数字和1个null)。
有关此处的值与包括终结器在内的数字数量有关的可读性,我将定义一个可以修改以适合您需求的宏。
#define NUM_OF_DIGITS 3
然后,您可以在整个代码中使用此宏。
char (*str)[NUM_OF_DIGITS] = malloc(5 * NUM_OF_DIGITS);
最后,可以声明main()
中的接收变量并分配返回的数组。
char (*str)[NUM_OF_DIGITS] = fun(arr);
您的完整代码应该看起来像:
代码
char (*fun(int arr[]))[]
{
char (*str)[NUM_OF_DIGITS] = malloc(5 * NUM_OF_DIGITS);
int i;
for(i=0;i<5;i++)
{
snprintf(str[i],NUM_OF_DIGITS,"%d",arr[i]); //control and limit to single digit + null
}
return str;
}
int main()
{
int arr[] = {24,1,33,4,5},i;
char (*str)[NUM_OF_DIGITS] = fun(arr);
for(i=0;i<5;i++)
{
printf("%s",str[i]);
}
free(str);
return 0;
}
输出
2413345
使用此方法,您只需要释放一次分配的内存。