一个很简单但很奇怪的C语言问题

来源:百度知道 编辑:UC知道 时间:2024/09/28 11:16:49
#include <stdio.h>
struct st{

char c ; char s[80];

};

char *f(struct st t);

void main ()

{ int k;

struct st a[4]={{'1',"123"},{'2',"321"},{'3',"123"},{'4',"321"}};

char *p;
for(k=0;k<4;k++)
{
p=f(a[k]);
printf("%s\n",p); //就是这句~~~
}
}

char* f(struct st t)

{int k=0;

while(t.s[k]!='\0'){

if(t.s[k]==t.c) return t.s+k;

k++;

}
return t.s;
}

这段代码作用是返回结构体中第一个字符出现在第二个字符串开始的位置,问题在那个printf()处,我调试的时候发现明明printf()前面的指针p已经指向正确的值了(比如第一个数组,p已经指向“123”了),但printf()后确实个空字符,后几个数组打印出来也是乱码,这是怎么回事呢??

你的函数的形参传的是值,在进入函数时为struct st t分配空间,在函数结束后该空间被释放了,所以是乱码

试试用引用
char *f(struct st &t);//声明
char* f(struct st &t){}//定义

我这里第运行结果
123
21
3
123
没有乱码
没搞清楚你想实现的功能
据猜测改了下代码,看看是不是你想要的
#include <stdio.h>
struct st{
char c ;
char s[80];
};

int f(struct st t);

void main ()
{
int k ;
struct st a[4]={{'1',"123"},{'2',"321"},{'3',"123"},{'4',"321"}};
int p;
for(k=0;k<4;k++)
{
p=f(a[k]);
printf("%d\n",p); /* 就是这句~~~ */
}
getch();
}

int f(struct st t)
{
int k=0;
while(t.s[k]!='\0')
{
if(t.s[k]==t.c) return k;
k++;
}
return -1;
}

char* f(struct st t)
你这里是传值进去的,改成传址进去就好了
因为f返回的