从函数返回一个指针数组

时间:2017-11-01 15:02:52

标签: c arrays pointers

我正在尝试使用函数打印给定字符串中每个字符的整数值。当我将字符串传递给此函数时,它会将给定字符串中的每个字符转换为整数,然后将其保存到结果数组中。我还创建了一个指针数组,它将保存每个字符的相应整数的地址。但是当我返回这个指针数组时,我无法正确打印所有整数值。

#include <stdio.h>
int *c2i(char *str); 

int main(){

    char s[20];
    int *p, i;
    printf("Enter your string:\n");
    scanf("%s", s);
    p=c2i(s);
    for(i=0; i<4; i++){
        printf("\n%d\t%d\n", *p, p);
        p++;
    }

    return 0;
}

int *c2i(char *str){

    int i=0, result[20], *ptr[20];

    while(*(str+i)!='\0'){
        result[i]=*(str+i) & 0xff;
        ptr[i]=&result[i];
        i++;
    }
    printf("%d %d %d %d %d %d %d %d", *ptr[0], *ptr[1], *ptr[2], *ptr[3], ptr[0], ptr[1], ptr[2], ptr[3]);

    return *ptr;
}

我已经包含了许多 printf 语句,仅用于调试目的。当我尝试运行上面的代码时,程序的输出是:

  

输入您的字符串:

     

ABCD

     

97 98 99 100 6356588 6356592 6356596 6356600

     

97 6356588

     

1999382056 6356592

     

20 6356596

     

1 6356600

当我在 main() 函数中打印时,我只能正确获取第一个值。当我增加指针并尝试打印下一个值时,我得到垃圾结果。我可以看到地址相同但值已损坏。我在这里做错了什么?

3 个答案:

答案 0 :(得分:2)

您无法返回堆栈分配的数组,因为一旦函数调用完成,它就不再被标记为正在使用中。相反,您应该malloc数组,例如int *ptr = malloc(sizeof(int)*20);。还记得在完成数组时free数组(这是一个很好的做法)。有关详细信息,请参阅这些帖子

Returning an array using C

returning a local variable from function in C

答案 1 :(得分:2)

这个怎么样

#include <stdio.h>
#include <string.h>

#define MAXLEN 20

void c2i(char *str, int *out, int len); 

int main(){

    char s[MAXLEN];
    int  out[MAXLEN];
    int *p, i;

    printf("Enter your string:\n");
    /* fgets safer that scanf, 
      protects buffer overrun */
    fgets(s, sizeof(s), stdin);
    /* fgets gives you the newline char though, 
      so remove it */
    if(s[strlen(s)-1] == '\n') {
        s[strlen(s)-1] = '\0';
    }

    c2i(s,out,strlen(s));
    for(i=0; i<strlen(s); i++){
        printf("%d\n", out[i]);
    }

    return 0;
}

void c2i(char *str, int *out, int len){

    int i=0;

    for(i=0; i<len; i++)
    {
        out[i]=*(str+i) & 0xff;
    }
}

将out缓冲区传递给c2i意味着你不需要malloc / free一个缓冲区,但这可能只是一个品味问题。

使用fgets意味着而不是scanf意味着您可以防止缓冲区溢出,并且您的字符串也可以包含空格。

答案 2 :(得分:1)

#include <stdio.h>

int** c2i(char *str) {

    int i=0, *result, **ptr;
    result = (int *)malloc(20*sizeof(int)) ;
    ptr = (int **)malloc(10*sizeof(int *)) ;

    while(*(str+i)!='\0'){
        result[i]=*(str+i) & 0xff;
        ptr[i]=&result[i];
        i++;
    }
    printf("%d %d %d %d %p %p %p %p", *ptr[0], *ptr[1], *ptr[2], *ptr[3], ptr[0], ptr[1], ptr[2], ptr[3]);

    return ptr;
}
int main(){

    char s[20];
    int **p, i;
    printf("Enter your string:\n");
    scanf("%s", s);
    p=c2i(s);
    for(i=0; i<4; i++){
        printf("\n%d\t%p\n", **p, *p);
        p++;
    }

    return 0;
}

双指针可能会解决您的问题,查看您修改过的代码。这会为您提供所需的结果。我附上了执行的屏幕截图.. enter image description here