Could someone comment on this code please.
1. Are the comments in it correct?
2. Why does sizeof(arr) not work consistently in C? In someFunction()
sizeof(arr) means sizeof(&arr[0]) in main. The compiler knows how big arr
is, so why the difference - esp. as it would be v.useful if sizeof(arr)
worked in someFunction as it does in main - so you could use sizeof(arr) in
the conditional bit of,say, a for loop in someFunction for example?
3. Why doesn't C allow testFunction to be declared char [] testFunction -
seems to me that if it did you could get away with knowing less about
pointers, and it seems as though again that C is incosistent, i.e., you
don't have to declare testFunction's parameter as char *. Surely, the
compiler should know that char [] someFunction actually means char *
someFunction??
char * testFunction(ch ar []);
int main(void)
{
/* Lie to the compiler. Should be ok though as the compiler knows how
big the array really is.*/
char arr[7] = "0123456789 ";
/* Ouput the sizeof the array. And the size of a pointer to it. */
printf("main() sizeof arr = %d\n", sizeof(arr));
printf("main() sizeof arr = %d\n", sizeof(&arr[0]));
/* Pass it on to the function where we'll do some other emaningless
things.*/
testFunction(ar r);
return 0;
}
/* Can't declare testFunction as char [] testF...() - even though the
compiler knows that array's are passed by address.*/
/* The size is ignored - and can't be checked anyway.*/
char * testFunction(ch ar arr[500])
{
int n;
/* Same sizeof line of code that was in main() - note here that it
output the size of a pointer!*/
printf("sizeof arr = %d\n", sizeof(arr));
return arr;
}
Dec 17 '05
27 1895
Mark McIntyre wrote: On Sat, 17 Dec 2005 20:11:41 GMT, in comp.lang.c , "jimbo" <ji***@gmail.co m> wrote:
2. Why does sizeof(arr) not work consistently in C?
It does. Please read the documentation on it carefully, understand the difrference between a pointer and an array, and understand what happens to arrays when passed as parameters to functions.
/* Lie to the compiler. Should be ok though as the compiler knows how big the array really is.*/ char arr[7] = "0123456789 ";
No, its disastrous. You just overwrote memory that doesn't belong to you.
Any compiler worth its salt will diagnose that error at compile time,
and so you will fix the problem, and never get to the stage of actually
overwriting memory.
In fact, it is a constraint, and as such must be diagnosed by a
standard-conforming C compiler:
6.7.8 Initialization
...
Constraints
2 No initializer shall attempt to provide a value for an object not
contained within the entity being initialized.
--
Simon.
On Sat, 17 Dec 2005 21:54:50 +0000, Mark McIntyre
<ma**********@s pamcop.net> wrote: On Sat, 17 Dec 2005 20:11:41 GMT, in comp.lang.c , "jimbo" <ji***@gmail.c om> wrote:
2. Why does sizeof(arr) not work consistently in C?
It does. Please read the documentation on it carefully, understand the difrference between a pointer and an array, and understand what happens to arrays when passed as parameters to functions.
/* Lie to the compiler. Should be ok though as the compiler knows how big the array really is.*/ char arr[7] = "0123456789 ";
No, its disastrous. You just overwrote memory that doesn't belong to you.
Isn't this simply a constraint violation (6.7.8-2) that requires a
diagnostic? Do any existing compilers actually initialize more than
the 7 bytes defined?
<<Remove the del for email>>
Simon Biber <ne**@ralmin.cc > wrote: You remember incorrectly. In the parameter list of a function, char[] and char* are exactly the same. In any other declaration they are different. char[] is never an array of pointers. It can represent an array of char, of unspecified size.
That is what I meant to say; the fact that I did not is disturbing. I
appreciate the correction.
--
Christopher Benson-Manica | I *should* know what I'm talking about - if I
ataru(at)cybers pace.org | don't, I need to know. Flames welcome.
"Keith Thompson" <ks***@mib.or g> wrote in message
news:ln******** ****@nuthaus.mi b.org... The indexing operator x[y], takes two operands, a pointer and an integer (*not* an array and an integer). Typically, the pointer operand is going to be an array name, which will be implicitly converted to a pointer before the indexing operator sees its value. x[y] is by definition equivalent to *(x+y). (Because addition is commutative, x[y] can be written as [y]x; this odd little quirk is in no way useful.) ^^^^
ITYM "x[y] can be written as y[x]". For example, "123"[1] is equivalent to
1["123"], but [1]"123" is a syntax error.
Keith Thompson a écrit : Here you are *not* returning an array, you are returning a pointer.
Or more likely, an address... Is this the old argument about the meanings of the terms "pointer" and "address"?
Yes. Based on the fact that a pointer is an variable whose value is an
address, an address itself is a pointer constant. It's also the value of
a pointer. (like 123 is an integer constant and also the value of
variable of type char or int etc.)
It's reasonable, IMHO, to use the term "pointer" only to refer to an object of pointer type, and the term "address" to refer to a *value* of pointer type.
I'm glad to read that.
Thus the value of a pointer object is an address. I generally try to use the terms this way myself.
But the standard doesn't make this distinction, at least not consistently. For example, the malloc() function "returns either a null pointer or a pointer to the allocated space".
Too bad and confusing. I would have written it like this:
<<the malloc() function "returns either a null pointer constant or the
address of the allocated space">>
Of course, it is useful to store this address into a pointer. Once
stored, the pointer points to the allocated block.
Simple wording, simple meaning, no trick... I understand better why
people have hard time with pointers. Seems obvious that the semantic
around'em isn't clear and consistent enough.
I think we have to accept that referring to a pointer value, such as "returning a pointer", is acceptable.
Unfortunately, yes.
--
A+
Emmanuel Delahaye
Flash Gordon a écrit : Emmanuel Delahaye wrote:
Flash Gordon a écrit :
Here you are *not* returning an array, you are returning a pointer.
} Or more likely, an address...
The last time I looked the null pointer was not an address,
There is no 'null pointer'. There is a 'null pointer constant' also
known as NULL.
Ok, I should have written :
<<Or more likely, an address the null pointer constant aka NULL>>
although I will happily accept correction if someone can point out something in the standard that says otherwise. So I think it more accurate to talk of returning a pointer than an address.
See Keith's response and my response to him.
--
A+
Emmanuel Delahaye
"Flash Gordon" <sp**@flash-gordon.me.uk> wrote in message
news:1a******** ****@news.flash-gordon.me.uk... jimbo wrote:
<snip> and it seems as though again that C is incosistent, i.e., you don't have to declare testFunction's parameter as char *. Surely, the compiler should know that char [] someFunction actually means char * someFunction??
If both were valid they would mean different things. One would mean returning an array, which C does not allow, whilst the other does mean returning a pointer to char.
"If both were valid they would mean different things"
Hmmmm
Suerly, there is an inconsistency here with char ?[]
If
char * someFunction(ch ar arr[])
Can also be written [and has the same meaning as]
char * someFunction(ch ar * arr)
Then we can interpret char arr[] as a parameter type as *NOT* meaning that
an array is passed. E.g., both of these *are* valid, and they both mean
*the same thing*. So "If both were valid they would mean different things"
is not necessarily a good argument against not allowing this as a return
type IMHO.
Why not interpret - consistently with this in a
function-definition/declaration sense - char [] someFun.... as *NOT* meaning
that an array is returned then?
Also, as using char [] as a return type will cause a compiler error, in the
future, its meaning could be 'aligned' with its use when used as a parameter
without breaking any 'old' code. IMHO, this would be a useful semantic
alignment to make.
"Simon Biber" <ne**@ralmin.cc > wrote in message
news:43******** *************** @news.optusnet. com.au... Christopher Benson-Manica wrote: Because char[] and char * are not the same. IIRC, char [] is an array of pointers of unspecified size.
You remember incorrectly. In the parameter list of a function, char[] and char* are exactly the same. In any other declaration they are different.
I think this is the OP's point - please see my other post re its use as a
return type.
Emmanuel Delahaye wrote: Keith Thompson a écrit : Here you are *not* returning an array, you are returning a pointer. Or more likely, an address... Is this the old argument about the meanings of the terms "pointer" and "address"?
Yes. Based on the fact that a pointer is an variable whose value is an address, an address itself is a pointer constant. It's also the value of a pointer. (like 123 is an integer constant and also the value of variable of type char or int etc.)
The problems I see with the term address are:
1) If you talk about returning an address you either imply that a null
pointer constant is an address leading to confusion about what you
can do with it, or continually say "address or null pointer" (or
something similar.
2) You are likely to confuse people about what they cad do. IMHO that
since address is a term used when talking about the hardware where no
type is involved (it is just memory), where as pointers are not.
After all, in summary, C pointers are slightly more abstract than
machine addresses.
<snip>
<<the malloc() function "returns either a null pointer constant or the address of the allocated space">>
Of course, it is useful to store this address into a pointer. Once stored, the pointer points to the allocated block.
I think it would be simpler if pointer or pointer value was used
throughout, see above. Just as I would refer to an int being returned by
a function.
Simple wording, simple meaning, no trick... I understand better why people have hard time with pointers. Seems obvious that the semantic around'em isn't clear and consistent enough.
Agreed. It would be better if consisten terminology is used. I think we have to accept that referring to a pointer value, such as "returning a pointer", is acceptable.
Unfortunately, yes.
I think it would be better if the term "address" was not used, expect
when talking about how pointers are implemented and possibly talking
about converting between pointer types. However, I recognise this is
very much my personal opinion, and I have no authority to call on, so
I'm certainly not going to complain about people talking about
addresses. I certainly see no point to a long discussion on this subject.
--
Flash Gordon
Living in interesting times.
Although my email address says spam, it is real and I read it.
Flash Gordon a écrit : The problems I see with the term address are:
<...> After all, in summary, C pointers are slightly more abstract than machine addresses.
<...> I think it would be better if the term "address" was not used, expect
May be the good wording should be 'reference' ?
"A reference is a (unique ?) value that identifies the memory location
of an object."
"NULL is a reference constant meaning invalid reference."
"A pointer is a variable that holds a reference to an object or NULL."
or:
"A pointer is a variable that holds the reference of an object or NULL."
"When a pointer is typed, the dereference operator (*) allows a read of
write acces to the referenced object."
etc. I'm not going to rewrite the C-standard, but I think that this kind
of wording could be used in C-books and tutorials for consistency.
--
A+
Emmanuel Delahaye This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics |
by: Fine |
last post by:
Hallo,
ich habe ein midlet mit eclipse erstellt und erhalte folgende Fehlermeldung
Error verifying method Approximate bytecode offset 5
Inconsistent or missing stackmap at target
Probleme macht anscheind die folgende Methode
public void commandAction(Command c, Displayable s) {
|
by: Jerzy Karczmarczuk |
last post by:
Gurus, before I am tempted to signal this as a bug, perhaps
you might convince me that it should be so. If I type
l=range(4)
l.extend()
l gives , what else...
On the other hand, try
|
by: jlea |
last post by:
I'm getting the following link error in my C++/.NET C++ project:
error LNK2022: metadata operation failed (8013118D) : Inconsistent layout
information in duplicated types (tagTOOLINFOA): (0x020000af).
I've done some internet research and have follewed the suggested procedure
of using ildasm and have confirmed that the type "tagTOOLINFOA" is in fact
at 0x020000af, but unfortunately I don't know what to do at this point. I
have messed...
|
by: Peter Steele |
last post by:
I've created an unmanaged C++ DLL and when I compile it I get numerous
errors of the form
xyz.cpp(nnn): warning C4273: '<somefunction>' : inconsistent dll linkage
I have other DLLs that have been created using the same basic pattern. I
using the approach where the following code appears in the .h file:
#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
|
by: codeman |
last post by:
Hi all
Lets say we have two tables:
Customer:
Customer_number : Decimal(15)
Name : Char(30)
Purchase:
Purchase_number : Decimal(15)
| |
by: James |
last post by:
When I ran db2dart to check a database, I got the following warning and
error messages.
1.Warning: The database state is not consistent.
2.Warning: Errors reported about reorg rows may be due to the
inconsistent state of the database.
3.Found some orphaned extent numbers in a DMS user tablespace.
Any advice on how to change database to be consistent and fix orphaned
data?
Thanks so much!
|
by: bachyen |
last post by:
I have the following code, but it is error when I build it. Can you help me?
Can you tell me more about 'Inconsistent accessibility: return type', 'Inconsistent accessibility: parameter type'.
using System;
public class Tinh_khoang_cach_Ham_tu_dinh_nghia
{
struct DIEM
{
public Double x;
|
by: Rahul Babbar |
last post by:
Hi All,
When could be the possible reasons that could make a database
inconsistent?
I was told by somebody that it could become inconsistent if you "
force all the applications to a close on that database and
transactions are not committed or rollbacked"
I infact, don't believe it, because i suppose when we do a "force
|
by: johnthawk |
last post by:
In the below code setting cell to inconsistent sets entire column inconsistent (renderer).However, I need a third state off | on | inconsistent . How can I change one path->cell?
Any help appreciated.
Thanks
john
# get current value
fixed = model.get_value(iter, MARK_FOR_COLUMN)
icont = model.get_value(iter,MARK_FOR_INCONSISTENT)
# clear for action
|
by: Lie |
last post by:
I've noticed some oddly inconsistent behavior with int and float:
Python 2.5.1 (r251:54863, Mar 7 2008, 03:39:23)
on linux2
-345
works, but
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
|
by: marktang |
last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main usage, and What is the difference between ONU and Router. Let’s take a closer look !
Part I. Meaning of...
| |
by: Hystou |
last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it.
First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
|
by: Oralloy |
last post by:
Hello folks,
I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>".
The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed.
This is as boiled down as I can make it.
Here is my compilation command:
g++-12 -std=c++20 -Wnarrowing bit_field.cpp
Here is the code in...
|
by: jinu1996 |
last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth.
The Art of Business Website Design
Your website is...
|
by: Hystou |
last post by:
Overview:
Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For most users, this new feature is actually very convenient. If you want to control the update process,...
|
by: tracyyun |
last post by:
Dear forum friends,
With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the choice of these technologies. I'm particularly interested in Zigbee because I've heard it does some...
|
by: isladogs |
last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM).
In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules.
He will explain when you may want to use classes instead of User Defined Types (UDT). For example, to manage the data in unbound forms.
Adolph will...
| |
by: conductexam |
last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one.
At the time of converting from word file to html my equations which are in the word document file was convert into image.
Globals.ThisAddIn.Application.ActiveDocument.Select();...
|
by: bsmnconsultancy |
last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...
| |