当前位置: 技术问答>linux和unix
一个奇怪的问题(关于指向结构体的指针)
来源: 互联网 发布时间:2015-04-27
本文导语: 下面的程序哪里错了?? typedef struct { SOCKET s; char *a; int b; }mystruct main() { SOCKET s[100]; ... myfun(s,"sssss"); ... } void myfun(SOCKET *s,char *sa) { mystruct *mst; int i; ...
下面的程序哪里错了??
typedef struct
{
SOCKET s;
char *a;
int b;
}mystruct
main()
{
SOCKET s[100];
...
myfun(s,"sssss");
...
}
void myfun(SOCKET *s,char *sa)
{
mystruct *mst;
int i;
for(i=0;is=s[i];
mst->a=sa;
mst->b=i;
}
}
typedef struct
{
SOCKET s;
char *a;
int b;
}mystruct
main()
{
SOCKET s[100];
...
myfun(s,"sssss");
...
}
void myfun(SOCKET *s,char *sa)
{
mystruct *mst;
int i;
for(i=0;is=s[i];
mst->a=sa;
mst->b=i;
}
}
|
你的程序有不少问题
typedef struct
{
SOCKET s;
char *a;
int b;
}mystruct; /*语法错误:这里少了一个 ;*/
main()
{
SOCKET s[100]; /*SOCKET是一个套接字*/
...
myfun(s,"sssss");/*函数定义的时候,第二个参数是char*, 应该传入的是一个地址*/
...
}
void myfun(SOCKET *s,char *sa)
{
mystruct *mst; /*这里只声明了一个mystruct结构的指针,没有分配空间*/
/*********************************/
mst=(mystrcut*)malloc(sizeof(mystrcut)); /*分配空间*/
/*********************************/
int i;
for(i=0;is=s[i];
mst->a=sa;
mst->b=i;
}
}
typedef struct
{
SOCKET s;
char *a;
int b;
}mystruct; /*语法错误:这里少了一个 ;*/
main()
{
SOCKET s[100]; /*SOCKET是一个套接字*/
...
myfun(s,"sssss");/*函数定义的时候,第二个参数是char*, 应该传入的是一个地址*/
...
}
void myfun(SOCKET *s,char *sa)
{
mystruct *mst; /*这里只声明了一个mystruct结构的指针,没有分配空间*/
/*********************************/
mst=(mystrcut*)malloc(sizeof(mystrcut)); /*分配空间*/
/*********************************/
int i;
for(i=0;is=s[i];
mst->a=sa;
mst->b=i;
}
}
|
关于char *和字符串.
在传递参数的时候,应该是把字符串当成char *的类型,char *,char [],""都是传递首地址的.
刚做的测试,
#include
#include
void test(char * t)
{
printf("char:%c%cn",*t,*(t+1));
return ;
}
main()
{
char s[]="efgh";
test("abcd");
test(s);
}
编译过程中无任何警告,执行也正常,输出ab,ef.
在传递参数的时候,应该是把字符串当成char *的类型,char *,char [],""都是传递首地址的.
刚做的测试,
#include
#include
void test(char * t)
{
printf("char:%c%cn",*t,*(t+1));
return ;
}
main()
{
char s[]="efgh";
test("abcd");
test(s);
}
编译过程中无任何警告,执行也正常,输出ab,ef.
|
兄弟,
mystruct *st;
定义了一个结构类型的指针的空间,而不是一个结构的空间,
你也许需要这样:
st=malloc(sizeof(mystruct)); //不知道语法是否正确,
如果是在有些C++或者C中支持 new()的话也可以用着个涵数.
mystruct *st;
定义了一个结构类型的指针的空间,而不是一个结构的空间,
你也许需要这样:
st=malloc(sizeof(mystruct)); //不知道语法是否正确,
如果是在有些C++或者C中支持 new()的话也可以用着个涵数.
|
mst是指针类型的,不用new或malloc么?
|
哎~~~~~~~~~~~~~~
首先,可以不用管SOCKET是什么类型(应该是整数的吧),它的类型匹配没问题的,这看代码就可以知道了.
而定符串,字符数组,指向字符的指针都是一样的,在不引起混乱的情况下是可以通用的.这些都没问题.
而mst的多次赋值覆盖值的作法只是逻辑上的错误,最多有个warning.
关键是,你看看你的mst,是定义成指针的.而在没有给它赋值的情况下便使用了,现在没有哪个编译器会允许这种做法吧.指针在使用前是一定要赋值的,不然指向不明,new/malloc或是利用其他的指针来赋值.
首先,可以不用管SOCKET是什么类型(应该是整数的吧),它的类型匹配没问题的,这看代码就可以知道了.
而定符串,字符数组,指向字符的指针都是一样的,在不引起混乱的情况下是可以通用的.这些都没问题.
而mst的多次赋值覆盖值的作法只是逻辑上的错误,最多有个warning.
关键是,你看看你的mst,是定义成指针的.而在没有给它赋值的情况下便使用了,现在没有哪个编译器会允许这种做法吧.指针在使用前是一定要赋值的,不然指向不明,new/malloc或是利用其他的指针来赋值.
|
你声明的*mst在for循环中被多次覆盖,*mst的位置并没有发生变化,你将mst改成mystruct数组试试。
|
照FishCrazy(疯鱼)做就行了
呵呵,指针引用之前不给他分配空间就使用他。too naive!
呵呵,指针引用之前不给他分配空间就使用他。too naive!
|
SOCKET是一种什么数据类型啊!
不懂!
不懂!
|
SOCKET是什么类型?
s[i]是什么?地址?
s[i]是什么?地址?
|
大哥 ,你的myfun()函数的实参“sssss”是字符串 而你在定义myfun()函数的时候形参是字符型的啊 ,这根本就会出错嘛