我无法将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)
请帮我解决这个问题。
答案 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
。