为什么结构数组的 memset 会改变程序行为?
Why memset of array of structure changing the program behaviour?
#include <stdio.h>
#include <string.h>
#define PIPE "myPipeName"
typedef enum
{
ID1,
ID2
}TEST_ID;
typedef struct
{
double dCnt;
TEST_ID id ;
}Response;
int main()
{
char pipeName[256]=PIPE;
Response res[2];
printf("1. pipeName : %s , PIPE : %s\n",pipeName,PIPE);
memset(res,0,2*sizeof(res));
printf("2. pipeName : %s , PIPE : %s\n",pipeName,PIPE);
return 0;
}
实际 o/p:
- pipeName : myPipeName , PIPE :myPipeName
- pipeName : , PIPE : myPipeName
预期 o/p:
- pipeName : myPipeName , PIPE :myPipeName
- pipeName : myPipeName , PIPE :myPipeName
请告诉我如何解决这个问题?
你 运行 越界了,这会调用 undefined behavior
改变
memset(res,0,2*sizeof(res));
^^^^^^^^^^^^
到
memset(res,0,sizeof(res));
或者,如果您更喜欢 multiplied 版本(为了更好的可读性,也许?),请使用
memset( res , 0 , 2 * sizeof(res[0]));
或
memset( res , 0 , 2 * sizeof(Response));
也就是说,未初始化的自动变量值是不确定的。 不要尝试使用它们。
Response res[2];//is an array of 2 Responses
sizeof(res);//get the size of the array in bytes
memset(res,0,2*sizeof(res));//the multiplication by the size of the array is not needed here and
//the memset is writing 0 out of bound of the array and probably
//into pipeName which would be treated as null terminator character
写出数组边界是未定义的行为,因此更改为:
memset(res,0,sizeof(res));
您设置的尺码值有误
memset(res,0,2*sizeof(res));
应该
memset(res,0,sizeof(res));
因为 sizeof(res)
return 数组的字节大小。
或
memset(res,0,2*sizeof(Response));
由于 sizeof(Response)
return Response typedef 结构的大小(以字节为单位)。
#include <stdio.h>
#include <string.h>
#define PIPE "myPipeName"
typedef enum
{
ID1,
ID2
}TEST_ID;
typedef struct
{
double dCnt;
TEST_ID id ;
}Response;
int main()
{
char pipeName[256]=PIPE;
Response res[2];
printf("1. pipeName : %s , PIPE : %s\n",pipeName,PIPE);
memset(res,0,2*sizeof(res));
printf("2. pipeName : %s , PIPE : %s\n",pipeName,PIPE);
return 0;
}
实际 o/p:
- pipeName : myPipeName , PIPE :myPipeName
- pipeName : , PIPE : myPipeName
预期 o/p:
- pipeName : myPipeName , PIPE :myPipeName
- pipeName : myPipeName , PIPE :myPipeName
请告诉我如何解决这个问题?
你 运行 越界了,这会调用 undefined behavior
改变
memset(res,0,2*sizeof(res));
^^^^^^^^^^^^
到
memset(res,0,sizeof(res));
或者,如果您更喜欢 multiplied 版本(为了更好的可读性,也许?),请使用
memset( res , 0 , 2 * sizeof(res[0]));
或
memset( res , 0 , 2 * sizeof(Response));
也就是说,未初始化的自动变量值是不确定的。 不要尝试使用它们。
Response res[2];//is an array of 2 Responses
sizeof(res);//get the size of the array in bytes
memset(res,0,2*sizeof(res));//the multiplication by the size of the array is not needed here and
//the memset is writing 0 out of bound of the array and probably
//into pipeName which would be treated as null terminator character
写出数组边界是未定义的行为,因此更改为:
memset(res,0,sizeof(res));
您设置的尺码值有误
memset(res,0,2*sizeof(res));
应该
memset(res,0,sizeof(res));
因为 sizeof(res)
return 数组的字节大小。
或
memset(res,0,2*sizeof(Response));
由于 sizeof(Response)
return Response typedef 结构的大小(以字节为单位)。