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 }

sizeof对函数入参使用不准,布布扣,bubuko.com

时间: 2024-12-09 01:59:25

sizeof对函数入参使用不准的相关文章

特定元素个数的数组作为函数入参的两个方法

本文参考了如下链接:http://www.cnblogs.com/graphics/archive/2010/07/15/1777760.html 数组作为入参时,自动被转换为指针.因此数组定义的元素个数的参数无法带入函数.这不符合coder的预期,也是不严格和有风险的coding. 如何解决呢,一种办法是再加一个参数,指定元素个数 void Test(int* a, int n) { for (int i = 0; i < n; ++i) { cout << a[i] <<

函数入参使用指针和引用的区别

最近做一个工具,在整改函数时需要给一个全局变量赋值 RadixNode *g_pstRootBase 赋值的来源为已定义的结构体:TreeSet treeSet = {0}中的trSet->tNameSet[i].tName地址(其中i为变量. 以下是trSet结构体的定义: typedef struct tagTreeName{    RadixNode *tName;    char *fName;}TreeName; typedef struct tagTreeSet{    TreeNa

python函数入参和返回值

以下内容参考自runoob网站,以总结python函数知识点,巩固基础知识,特此鸣谢! 原文地址:http://www.runoob.com/python3/python3-function.html 函数格式大体如下def 函数名(参数列表): 函数体 例子: # 计算面积函数 def area(width, height): return width * height 定义一个函数:给了函数一个名称,指定了函数里包含的参数,和代码块结构. 这个函数的基本结构完成以后,不会执行,除非被调用 如

python获取函数所有入参的key-value

需要拿到一个函数里所有的传入的参数,并且存在一个字典里.下面的方法确实拿到了字典,不过要求函数必须用非固定参数**kwargs定义,而且对调用函数很不友好 def func1(**kwargs): d = 'local_d' return kwargs res = func1(a=1, b=2, c=3) print(res) # 结果: # {'a': 1, 'b': 2, 'c': 3} locals()函数会以字典类型返回当前位置的全部局部变量,看着很符合现在的需求: def func2(

c++调用python系列(1): 结构体作为入参及返回结构体

最近在打算用python作测试用例以便对游戏服务器进行功能测试以及压力测试; 因为服务器是用c++写的,采用的TCP协议,当前的架构是打算用python构造结构体,传送给c++层进行socket发送给游戏服务器,响应消息再交由python进行校验; 开始: 首先是c++调用python这一层需要打通; 幸运的是python自己有一套库提供c/c++进行调用; 下面我贴代码;用的vs2013,python用的2.7 1 // python_c++.cpp : 定义控制台应用程序的入口点. 2 //

Mybatis调用PostgreSQL存储过程实现数组入参传递

注:本文来源于 < Mybatis调用PostgreSQL存储过程实现数组入参传递  > 前言 项目中用到了Mybatis调用PostgreSQL存储过程(自定义函数)相关操作,由于PostgreSQL自带数组类型,所以有一个自定义函数的入参就是一个int数组,形如: CREATE OR REPLACE FUNCTION "public"."func_arr_update"(ids _int4)... 1 如上所示,参数是一个int数组,Mybatis提

解决WebApi入参时多对象的问题

我们的项目是用WebApi提供数据服务,且WebPage跟APP中都有调用到. WebApi提供的接口一多,就发现一个问题,我们项目中有很多接口是接收POST(安全原因,我们采用的是https)请求的,而且入参基本也就是一两个参数.在开发的后期发现WebApi中有很多对象,多到已经快到了难以管理的地步了. 比如我们的WebApi如下: 对应的入参对象是: 很难想象如果再有别的Controller的话,Models中会有多少对象,而这些对象往往使用一次,或者在一个方法中使用了一下就不再用了. 这显

关于函数传参--传指针,传引用

今天和同学讨论到指针和引用的传递问题,有些想法从推理上讲是正确的,但是因为是推理,说出自己观点的时候不是那么有底气,本着实践是检验真理的唯一标准的原则,在电脑上敲了几段代码,验证了推理的正确性. 先上代码,再分析. 代码1: void Swap0(int a1,int b1){ int temp; temp=a1; a1=b1; b1=temp; } void Swap1(int *a1,int *b1){ //交换地址 int *temp; temp=a1; a1=b1; b1=a1; } v

shell 通过shift获得某位后的入参

有时shell的入参个数不定,想要获得第2位后的参数,作为新的入参调用其他脚本 通常这时候想到的方法是用遍历,例如下面的方法: for (( i=2;i<=$#;i++)) do echo $i done 更简便的方法:使用shift去移动参数,shift (n),默认n为1,移动的位数 shift会将n位前的入参舍弃掉,只会保留n+1以及他后面的入参 例如:shift 2,会舍弃第一位第二位入参,只保留第3位及以后的入参 执行 test.sh 1 2 3 4 5 6 7 8 9,test.sh