将char数组传递给另一个函数

时间:2016-02-13 07:12:39

标签: c arrays function pointers char

我无法将char数组从函数传递给main。

而不是实际的数组,它显示了一些不需要的符号。请帮帮我。

#include <stdio.h>

char* setDestPath (int x, char inp_path[x])
{
   int ret, cnt=0, i=0, j, temp=0;
   char dest_path[x], out_path[]={'O','U','T','P','U','T','.','b','m','p','\0'};

   while (inp_path[i] !=NULL)
   {
      if (inp_path[i] == '/')
      {
         cnt = i;               
      }
      dest_path[i] = inp_path[i];
      i++;
   }

   for (j=cnt+1;j<x; j++)
   {
      dest_path[j] = NULL;
   }    

   if (cnt > 0)
   {
      for (i=cnt+1; i<=cnt+10; i++)
      {
         dest_path[i] = out_path[temp];
         temp++;
      }
   }
   else
   {
      for (i=cnt; i<cnt+10; i++)
      {
         dest_path[i] = out_path[temp];
         temp++;
      }
   }

   ret = dest_path;
   printf ("\n\nAddress in function is: %d",ret);
   i=0;
   while (i != x)
   {
      printf("\n (%d) %c ", i, dest_path[i]);
      i++;
   }
   return dest_path;
}

int main()
{
   int ch, counter, x=40, temp=0, cnt=0, i=0;
   char inp_path[x], dest_path[x];
   char *path;
   FILE *fp1, *fp2;

   printf("\nEnter the path of image file: \n");
   gets(inp_path);
   path = setDestPath(x, inp_path);
   printf ("\n\nAddress in main is: %d", path);

   while (i != x)
   {
      printf("\n (%d) %c ", i, path[i]);
      i++;
   }

   fp1 = fopen(inp_path, "r+");
   /*remove(dest_path);
     fp2 = fopen(dest_path, "a+");*/

}

数组在setDestPath()内正确显示,但不会在main中显示。我正在获得一些wiered符号。

输出:

Enter the path of image file:
g:/project.bmp
Address in function is: 2358448

 (0) g
 (1) :
 (2) /
 (3) O
 (4) U
 (5) T
 (6) P
 (7) U
 (8) T
 (9) .
 (10) b
 (11) m
 (12) p
 (13)
 (14)
 (15)
 (16)
 (17)
 (18)
 (19)
 (20)
 (21)
 (22)
 (23)
 (24)
 (25)
 (26)
 (27)
 (28)
 (29)
 (30)
 (31)
 (32)
 (33)
 (34)
 (35)
 (36)
 (37)
 (38)
 (39)

Address in main is: 2358448
 (0)
 (1)
 (2) ╚
 (3) 6
 (4) √
 (5) ⌂
 (6)
 (7)
 (8)
 (9)
 (10) ╚
 (11) 6
 (12) √
 (13) ⌂
 (14)
 (15)
 (16) 8
 (17) ²
 (18) #
 (19)
 (20)
 (21)
 (22)
 (23)
 (24)
 (25)
 (26) ╚
 (27) 6
 (28) √
 (29) ⌂
 (30)
 (31)
 (32) ☺
 (33)
 (34)
 (35)
 (36)
 (37)
 (38)
 (39)

请帮我解决这个问题。

1 个答案:

答案 0 :(得分:1)

<强>问题

dest_path是函数的本地数组。函数返回时,数组将被销毁。将dest_path从函数返回为:

return dest_path;

你正在返回一个指针,它将在调用函数中悬挂指针。这是你的问题的原因。由于您正在访问悬空指针,因此您的程序将受到未定义的行为。

您可以通过返回使用malloc动态分配的数组或从main传递数组并将其填入函数中来解决。

解决方案1:

而不是

char dest_path[x];

使用

char* dest_path = malloc(x);

然后,确保你打电话

free(path);
在函数结束之前在main

解决方案2:

main中声明一个数组并传入函数。

   char path[1000];   // Make it large enough for your needs.

然后将其用作:

   setDestPath(x, inp_path, path);

为此,您需要将功能签名更改为:

void setDestPath (int x, char inp_path[x], char dest_path[]) { ... }

<强> PS

根本不要使用gets。请改用fgets