sizeof()在c中返回奇怪的值
大家好,我正在为一个分配实现一个多协议服务器,问题是当我将一个函数(它与TCP配合得很好)与UDP一起使用时,它会为sizeof(rslt)返回一些奇怪的值 这是打印sizeof(rslt)的结果 227247297301947350235747870977813574557746855765842499800244190653611912802345262751100971853876242196396379418048822289326499595663913702585651046253256334452274950507892388016152332207357456528202978444159487749182703597538436094324394051880354838420203925482233596686868686866767674141414141414175756742644798608214126898620261227036196985617864721898152919768989286234621310882472277578077210724037954593348269148476835319682392369405001998132692888272764779291883841036795450173075483486283316456690985689093706570659715313373418416626032785942216737626420701207457060042692034113809058230242645165284602182668910345057412276106351085668501025471942442344915958025484738205854146122217473526142186017692920701058864986750388007266706549779899075196338201185437947481794203307088943805129359229291979011929586850204537014834772436384414446076445840451035668547324720434371828348370311512769864669240050561072731126155761543055808184568318969867074799216668048506769780091751394820116008722477816961981513603374444219862671625188097499622795413732901409586672517257870771774219174910321872828714060096821866760216162806693047039766836263375334134647593797749701939073473442243496461269104846522636525828614295376224700609500018984330561783847377901850347270541006554080785016501004196534609146133120033251145149769049779036737854348655192422189329278467247499329146806230782304594733907216315718793570281926207997806702496284048904446250813724590323511394423491930232316489531788923932152258695604873877344476076989876437595819171306479678050176777718605659834558682850919638165545391335090049897674411676070277922540425363814778447530392448483914523251308861545066293730151590284107404772704776816410900457206266688174500512712866439202351398884602886744385761783550661724848436204069903056648633523485191780275321057855888694641036551796412716727623299092522858290604590099107685296585504067001603769945664562470107174837039533665273582630486408048896007093631520324322524100859517067127990524303448959286944425829576454316333690530343056674638230906634647607381640905561525257744661647440376860111016638001700783669212090565003039144740560878922353582981640243572153915886411947071159781404072261541189065424497638344651660586321264435048944204997415130063108225835529197687615484629774123116472368685958222206630054915115618507461784801046813544644398678841637428900989462942436882113514841632037095541844031558486117095067338825934681699013503068846779959159320103211142855059737404068473702861206351583475182475102776613233000438730479503921649424316454183029479504135062107345404378527466396253753476100129956781399010999183783802618238213362096457459802141302288112719940445509784486788013808151429034705404689431688949179720708879650918448834785976461292411819273867025864362288697787098644909453881997881572293361444958689283701304285225816849883161755671238872886017097379498420189964777858519101592688663228198394897922360739652434440789667093624907437541226941591245240520207924844128128689438000349924777668111471837242091354159876382021580285379055144718999771005721982983040428783187294609501155912764173768110035459865747935310753231316846263813392915098534543581632657148613313847771071945323639593164682251934093473442545195777200094227132896445437604026121219696929191697809114520884878334125905900512421291098451577200081936661332535029167862238105207037779640033290580769523854129888509506515360662130224968227136008058671505279388721663085953930853769866032069329590096954491495015630933753747808211859974560578358111052927752530637720023827194678573934473710792224546360846934854848774794845984636928997991447694646355496557324158438719071147050424155219037044882503261933744024145388096967434144945092298185160371896905205559404947754870769573442000107814157031764157282408089592334394363291279752699027873173998478039717457143900373272033155054527496375858737124960562284419088384.000000 服务器sizeof()在c中返回奇怪的值,c,sockets,C,Sockets,大家好,我正在为一个分配实现一个多协议服务器,问题是当我将一个函数(它与TCP配合得很好)与UDP一起使用时,它会为sizeof(rslt)返回一些奇怪的值 这是打印sizeof(rslt)的结果 2272472973019473502357478709778135745577468557658424998002441906536119128023452627511009718538762421963963794180488222893264995956639137025856510462532
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <netinet/tcp.h>
#include <errno.h>
#define MAXLINE 100
struct equation {
float a;
char c;
float b;
};
struct result {
long double res;
};
int MAX (int a,int b){
if (a>b) return a;
return b;
}
int readn(int fd, void *vptr, size_t n)
{
size_t nleft;
ssize_t nread;
char *ptr;
ptr = vptr;
nleft = n;
while (nleft > 0) {
if ( (nread = read(fd, ptr, nleft)) < 0) {
if (errno == EINTR)
nread = 0; /* and call read() again */
else
return (-1);
} else if (nread == 0)
break; /* EOF */
nleft -= nread;
ptr += nread;
}
return (n - nleft); /* return >= 0 */
}
int writen(int fd, const void *vptr, size_t n)
{
size_t nleft;
ssize_t nwritten;
const char *ptr;
printf ("\nI'm In %Lf\n",n);
ptr = vptr;
nleft = n;
printf ("%Lf NNNNN %Lf SIZE %Lf \n",nleft,n,sizeof(*vptr));
while (nleft > 0) {
printf ("%Lf\n",nleft);
fflush (stdout);
if ( (nwritten = write(fd, ptr, nleft)) <= 0) {
if (nwritten < 0 && errno == EINTR)
nwritten = 0; /* and call write() again */
else
return (-1); /* error */
}
nleft -= nwritten;
ptr += nwritten;
}
printf ("\n 5alawees \n");
// printf ("\n%s\n",vptr);
// ffulsh (stdout);
return (n);
}
void HandleClient(int comm_fd);
void Die (const char * msg)
{
perror(msg);
exit(1);
}
int passiveUDP (short port){
struct sockaddr_in servaddr;
int listen_fd;
if ((listen_fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
Die("Falied to create socket");
};
//printf ("%d" ,listen_fd);
memset( &servaddr,0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htons(INADDR_ANY);
servaddr.sin_port = htons(port);
if (bind(listen_fd, (struct sockaddr *) &servaddr, sizeof(servaddr))<0)
{
Die("Failed to bind socket to address");
}
return listen_fd;
}
int passiveTCP (short port){
struct sockaddr_in servaddr;
int listen_fd;
if ((listen_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
Die("Falied to create socket");
};
memset( &servaddr,0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htons(INADDR_ANY);
servaddr.sin_port = htons(port);
if (bind(listen_fd, (struct sockaddr *) &servaddr, sizeof(servaddr))<0)
{
Die("Failed to bind socket to address");
}
if (listen(listen_fd, 10) < 0)
{
Die("Failed to listen on server socket");
}
return listen_fd;
}
int main(int argc, char * argv[])
{
if (argc != 2) {
fprintf(stderr, "USAGE: ./HelloITServer <port>\n");
exit(1);
}
char str[100];
int listen_fd, comm_fd;
int usock = passiveUDP (atoi (argv[1])); /* UDP socket */
int tsock = passiveTCP (atoi (argv[1])); /* TCP master socket */
int nfds;
fd_set rfds; /* readable file descriptors */
struct sockaddr_in fsin; /* the request from address */
nfds = MAX(tsock, usock) + 1;
FD_ZERO(&rfds);
while (1) {
FD_SET(tsock, &rfds);
FD_SET(usock, &rfds);
printf ("HELLO");
if(select(nfds, &rfds, NULL, NULL, NULL) < 0){
printf("select error: %d \n",errno);
exit (1);
}
if(FD_ISSET(tsock, &rfds))
{
/* TCP slave socket */
printf ("Hello TCP");
int ssock;
//int alen = sizeof(fsin);
ssock = accept(tsock, (struct sockaddr *) NULL, NULL);
if(ssock < 0)
Die("accept failed: jkjkjkjkjkj \n");
HandleClient (ssock);
close (ssock);
}
if(FD_ISSET(usock, &rfds))
{
printf ("Hello UDP");
HandleClient (usock);
}
}
}
void HandleClient(int comm_fd)
{
struct equation eq;
struct result rslt;
bzero (&eq,sizeof (eq));
bzero (&rslt, sizeof (rslt));
if ((readn (comm_fd, &eq, sizeof(eq))) == 0){
Die("Failed to receive from client");
}
printf ("\n%Lf %Lf\n",sizeof (struct result),sizeof (rslt));
printf ("reciveed %f %c %f",eq.a,eq.c,eq.b);
switch (eq.c) {
case '+':
rslt.res = eq.a+eq.b;
break;
case '-':
rslt.res = eq.a-eq.b;
break;
case '*':
rslt.res = eq.a*eq.b;
break;
case '/':
rslt.res = eq.a/eq.b;
break;
case '%':
rslt.res = (int)eq.a% (int)eq.b;
break;
default:
break;
}
printf ("\n%Lf\n",sizeof(rslt));
printf ("\n%Lf\n",sizeof(rslt));
printf ("\n%Lf\n",sizeof(rslt));
writen (comm_fd, &rslt, sizeof (rslt));
//close (comm_fd);
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义MAXLINE 100
结构方程{
浮动a;
字符c;
浮球b;
};
结构结果{
长双色;
};
最大整数(整数a,整数b){
如果(a>b)返回a;
返回b;
}
int readn(int fd,void*vptr,size\u t n)
{
尺寸(左);;
ssize_t nread;
char*ptr;
ptr=vptr;
nleft=n;
而(nleft>0){
如果((nread=read(fd,ptr,nleft))<0){
如果(errno==EINTR)
nread=0;/*并再次调用read()*/
其他的
返回(-1);
}如果(nread==0),则为else
中断;/*EOF*/
nleft-=nread;
ptr+=nread;
}
return(n-nleft);/*return>=0*/
}
整数写入(整数fd,常数void*vptr,大小n)
{
尺寸(左);;
没有写的;
常量字符*ptr;
printf(“\n我在%Lf\n”,n);
ptr=vptr;
nleft=n;
printf(“%Lf NNNNN%Lf SIZE%Lf\n”,nleft,n,sizeof(*vptr));
而(nleft>0){
printf(“%Lf\n”,nleft);
fflush(stdout);
如果((nwrite=write(fd,ptr,nleft))=0*/
}
整数写入(整数fd,常数void*vptr,大小n)
{
尺寸(左);;
没有写的;
常量字符*ptr;
ptr=vptr;
nleft=n;
而(nleft>0){
if((nwrite=write(fd,ptr,nleft))sizeof()
返回未指定类型的无符号整数值
格式规范%Lf
需要一个长双精度
参数
尝试:
或者如果要打印rslt
的内容:
printf ("\n%Lf\n",rslt.res);
请注意,当我编译诸如printf(“%Lf\n”,sizeof(rslt));
w之类的代码时
printf ("\n%u\n",(unsigned int) sizeof(rslt));
printf ("\n%Lf\n",rslt.res);
so-test.c:13:33: warning: format ‘%Lf’ expects argument of type ‘long double’, but argument 2 has type ‘long unsigned int’ [-Wformat]
printf ("\n%Lf %Lf\n",sizeof (struct result),sizeof (rslt));
...
printf ("\n%Lf\n",sizeof(rslt));
printf ("\n%Lf\n",sizeof(rslt));
printf ("\n%Lf\n",sizeof(rslt));