首页 > 代码库 > sizeof对函数入参使用不准

sizeof对函数入参使用不准

 

被调用函数内部,无法知道入参的字符数组的可用内存长度
所以函数字符指针作为入参时,一定要加一个 此指针指向的内存空间长度入参int nSize

错误的写法:

 1 #include "stdafx.h"
 2 #include <string.h>
 3 #include <stdarg.h>
 4 
 5 // 返回非0表达式验证不通过,不用调用子系统功能号
 6 int getFilters(char * pszInput, char *pszFuncid)
 7 {
 8     char sztmp[64]={0,};
 9     char szFilters[256]={0,};
10     char szFilter[256]={0,};
11     char szFilterName[64]={0,};
12     char szFilterVal[256]={0,};
13     char sztmpVal[512]={0,};
14 
15     // 被调用函数内部,无法知道字符数组的可用内存长度
16    //所以函数形参字符指针,用char * pszInput,int nSize
17     // int a = sizeof(pszInput);  //sizeof不准 a=4
18     // int b = sizeof(*pszInput);  //sizeof不准 b=1
19     // int c = strlen(pszInput);  //strlen测量字符串的字符个数 c=18
20     strncpy(sztmpVal, pszInput, sizeof(pszInput)); // sztmpVal = "2610"
21 
22    //...
23     return 0;
24 }
25 
26 
27 
28 int _tmain(int argc, _TCHAR* argv[])
29 {
30     char szFuncid[64]={0,};
31     char szOtcCfg[512]={0,};
32 
33     sprintf(szOtcCfg,"26100012[EMAIL=wx]");
34 
35     int b = sizeof(szOtcCfg);  //  b=512
36     getFilters(szOtcCfg, szFuncid);
37 
38     getchar();
39 
40     return 0;
41 }

 正确的写法:

 1 // test.cpp : 定义控制台应用程序的入口点。
 2 //
 3 
 4 #include "stdafx.h"
 5 #include <string.h>
 6 #include <stdarg.h>
 7 
 8 // 返回非0表达式验证不通过,不用调用子系统功能号
 9 int getFilters(char * pszInput,int nSize, char *pszFuncid)
10 {
11     char sztmp[64]={0,};
12     char szFilters[256]={0,};
13     char szFilter[256]={0,};
14     char szFilterName[64]={0,};
15     char szFilterVal[256]={0,};
16     char sztmpVal[512]={0,};
17 
18     // 被调用函数内部,无法知道字符数组的可用内存长度, 所以函数形参字符指针,要用char * pszInput,int nSize
19     // int a = sizeof(pszInput);  //sizeof不准 a=4
20     // int b = sizeof(*pszInput);  //sizeof不准 b=1
21     // int c = strlen(pszInput);  //strlen测量字符串的字符个数 c=18
22     strncpy(sztmpVal, pszInput, nSize);  // sztmpVal=26100012[EMAIL=wx]
23 
24    // ...
25 
26     return 0;
27 }
28 
29 
30 
31 int _tmain(int argc, _TCHAR* argv[])
32 {
33     char szFuncid[64]={0,};
34     char szOtcCfg[512]={0,};
35 
36     sprintf(szOtcCfg,"26100012[EMAIL=wx]");
37 
38     int b = sizeof(szOtcCfg);
39     getFilters(szOtcCfg, sizeof(szOtcCfg), szFuncid);
40 
41     getchar();
42 
43     return 0;
44 }