Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C: Why can you pass (to a function) a struct by value, but not an array?

Any historical or logical reasons behind it?


Explanation: when you pass an array to a function in C you actually only pass a pointer to an array. However, when you pass a struct, you can either pass a copy of the struct or the pointer.

//this:
int function(int array[10])
// is equivalent to this:
int function(int *array)
//and they both pass a pointer

//but this:
int function(struct tag name)
//passes a struct by value, where as this:
int function(struct tag *name)
//passes a pointer to it.

Why the difference?

like image 687
Maverick Meerkat Avatar asked Jul 23 '16 16:07

Maverick Meerkat


Video Answer


1 Answers

In the original K&R, you could not pass structs by value. That was a syntax error. Because many compiler vendors offered it as an extension, pass-by-value eventually made its way into the standard.

Why the restriction, and why the evolution? The machines that C was developed on were tiny. Segment sizes of 64 kilobytes were common. Memory was precious, so why copy something when you could just pass the address? Duplicating a 64-byte structure on the stack was an error, probably not even what the user intended.

By the mid-1990s, that wasn't true anymore. 32-bit addressing and RAM of 4 MB or more were common. The restriction was a hinderance and led to some complexity, because without const a structure passed by reference could be modified, perhaps unwittingly.

Why not do the same with arrays? No demand. Arrays and pointers are closely related in C, as you know. The C standard library depends heavily on passing by reference, consider memset and strcpy. Whereas passing a struct by value meant just dropping the & on the call, passing an array by value would have entailed adding new syntax. A compiler vendor that offered, say, by value as C syntax would have been laughed out of the conference.

like image 153
James K. Lowden Avatar answered Oct 19 '22 17:10

James K. Lowden