Различные результаты sizeof

use Class7917
select * from Emp
alter table Emp add images varchar(100)
sp_helptext 'usp_emp_insert_update'
alter proc usp_emp_insert_update  
@empid int,  
@name varchar(50),  
@cid int,  
@sid int,  
@dob datetime,  
@isactive int,  
@hobbies varchar(100),
@images varchar(100)  
as  
begin  
 if(@empid=0)  
  begin  
   insert into Emp(Name,cid,sid,dob,isactive,hobbies,images)  
   values(@Name,@cid,@sid,@dob,@isactive,@hobbies,@images)  
  end  
 else  
  begin  
   update Emp set Name=@name,cid=@cid,sid=@sid,  
   dob=@dob,isactive=@isactive,hobbies=@hobbies,images=@images   
   where EmpID=@empid  
  end  
end
truncate table Emp
16
задан Kirill Kobelev 4 January 2017 в 12:51
поделиться

4 ответа

Поскольку Вы не можете передать целые массивы как параметры функции в C. Вы на самом деле передаете указатель на него; скобки являются синтаксическим сахаром. Нет никаких гарантий массива, на который Вы указываете, имеет размер 8, так как Вы могли передать эту функцию любой символьный указатель, который Вы хотите.

// These all do the same thing
void foo(char cvalue[8])
void foo(char cvalue[])
void foo(char *cvalue)
46
ответ дан 30 November 2019 в 15:18
поделиться

C и массивы C++ не являются объектами первого класса; Вы не можете передать массивы функциям, они всегда затухают к указателям.

можно, однако, передать указатели и ссылки на массивы. Это препятствует тому, чтобы границы массива затухли. Таким образом, это законно:

template<typename T, size_t N>
void foo(const T(&arr)[N])
{
    int n = sizeof(arr);
}
14
ответ дан 30 November 2019 в 15:18
поделиться

В первом примере cvalue, поскольку переданный параметр находится в действительно просто указателе на символьный массив и когда Вы берете sizeof() из него, Вы получаете размер указателя. Во втором случае, где Вы объявили его как локальную переменную, Вы получаете размер целый массив.

1
ответ дан 30 November 2019 в 15:18
поделиться

Размер параметра в 32-разрядных системах будет 4, и в 64-разрядных системах, скомпилированных с-m64, будет 8. Это вызвано тем, что массивы передаются как указатели в функциях. Указатель является просто адресом памяти.

0
ответ дан 30 November 2019 в 15:18
поделиться