|
俺的书上说,不能直接给指针赋值,可能发生溢出
书上举的例子是这样的:
- swap(int *p1,int *p2)
- {
- int *temp;
- *temp=*p1;
- *p1=*p2;
- p2=*temp;
- }
复制代码
据说这样的程序有时候能正确运行,但是*temp变量没有确定的地址址,可能会产生不可遇见的情况;
不过,偶到另一本书上的例子
- #include <stdio.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <netdb.h>
- char *host_name="127.0.0.1";
- int port=8000;
- void main(int argc,char *argv[]){
- char buf[8129];
- char message[256];
- int socket_descriptor;
- struct sockaddr_in pin;
- struct hostent *server_host_name;
- char *str="A default test string";
- if(argc<2){
- printf("Usage:test "Any test string"\n");
- printf("We will send a default test string.\n");
- }
- else{
- str=argv[1];
- }
- if((server_host_name=gethostbyname(host_name))==0)
- {
- perror("Error resolving local host\n");
- exit(1);
- }
- bzero(&pin,sizeof(pin));
- pin.sin_family=AF_INET;
- pin.sin_addr.s_addr=htonl(INADDR_ANY);
- pin.sin_addr.s_addr=((struct in_addr *)(server_host_name->h_addr))->s_addr;
- pin.sin_port=htons(port);
- if((socket_descriptor=socket(AF_INET,SOCK_STREAM,0))==-1){
- perror("Error opening socket\n");
- exit(1);
- }
- if(connect(socket_descriptor,(void *)&pin,sizeof(pin))==-1){
- perror("Error connecting to socket\n");
- exit(1);
- }
- if(send(socket_descriptor,str,strlen(str),0)==-1){
- perror("Error in send\n");
- exit(1);
- }
- printf("..sent message.. wait for response...\n");
- if(recv(socket_descriptor,buf,8192,0)==-1){
- perror("Error in receiving response form server\n");
- exit(1);
- }
- printf("\nResponse from server:\n\n%s\n",buf);
- close(socket_descriptor);
- }
复制代码
第15行 char *str="A default test string";可以吗?
编译器能够自动分配地址吗?
第25行 if((server_host_name=gethostbyname(host_name))==0)
gethostbyname返回一个指针struct hostent类型的指针,这个指针的地址是什么是什么时候分配的?
还有,第34行 pin.sin_addr.s_addr=((struct in_addr *)(server_host_name->h_addr))->s_addr;
到底是什么东西,不很理解
查了struct hostent
- struct hostent
- {
- char *h_name; /* Official name of host. */
- char **h_aliases; /* Alias list. */
- int h_addrtype; /* Host address type. */
- int h_length; /* Length of address. */
- char **h_addr_list; /* List of addresses from name server. */
- #define h_addr h_addr_list[0] /* Address, for backward compatibility. */
- };
复制代码
发现最后一行#define h_addr h_addr_list[0],不明白在struct里#define是怎么一回事;
还有,第34行是对pin.sin_addr.s_addr赋值,那么第33行对pin.sin_addr.s_addr赋值又有什么意义?
问题有点多 |
|