Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C Programming (http://www.velocityreviews.com/forums/f42-c-programming.html)
-   -   Pointer incompatible type assignment to character. (http://www.velocityreviews.com/forums/t442372-pointer-incompatible-type-assignment-to-character.html)

gk245 04-19-2006 11:01 PM

Pointer incompatible type assignment to character.
 
I have something like this:

#include <stdio.h>

main ()
{
struct line
{
char write[20];
char read[20];

struct line *next;
};

struct line n1;

n1.write= "concepts";

}

However, if i try to compile it, i get a compiler error saying that
"incompatible types in assignment". Whats strange is that if i set
write as an integer, i don't get such a error and it compiles. Does
something special need to be done with character strings and pointers?

Thanks.



Ian Collins 04-19-2006 11:06 PM

Re: Pointer incompatible type assignment to character.
 
gk245 wrote:
> I have something like this:
>
> #include <stdio.h>
>
> main ()
> {
> struct line
> {
> char write[20];
> char read[20];
>
> struct line *next;
> };
>
> struct line n1;
>
> n1.write= "concepts";
>
> }
>
> However, if i try to compile it, i get a compiler error saying that
> "incompatible types in assignment". Whats strange is that if i set
> write as an integer, i don't get such a error and it compiles. Does
> something special need to be done with character strings and pointers?
>

They are different. You have declared write as an array of 20 char and
you are attempting to assign a pointer to const char to it.

I think you are confused regarding accessing an array through a pointer
and assigning to an array. You have to copy the string literal into the
array.

--
Ian Collins.

Giorgos Keramidas 04-19-2006 11:22 PM

Re: Pointer incompatible type assignment to character.
 
On Wed, 19 Apr 2006 19:01:27 -0400, gk245 <topsoil@mail.com> wrote:
> I have something like this:
>
> #include <stdio.h>
>
> main ()
> {
> struct line
> {
> char write[20];
> char read[20];
>
> struct line *next;
> };
>
> struct line n1;
>
> n1.write= "concepts";
>
> }


This is probably the usual confusion around arrays and pointers. You
cannot treat an array "as if" it was a pointer in the left part of an
assignment. Array names "decay" to pointers (to their first element)
when they are in the right part of an assignment, but the reverse is not
true.

You will have to use strncpy() or strlcpy() to copy the data from your
constant string into the array member of the structure, i.e. with:

size_t len;

len = sizeof(n1.write);
strncpy(n1.write, "concepts", len - 1);
n1.write[len - 1] = '\0';

or

strlcpy(n1.write, "concepts", sizeof(n1.write));


Keith Thompson 04-19-2006 11:46 PM

Re: Pointer incompatible type assignment to character.
 
gk245 <topsoil@mail.com> writes:
> I have something like this:
>
> #include <stdio.h>
>
> main ()
> {
> struct line
> {
> char write[20];
> char read[20];
>
> struct line *next;
> };
>
> struct line n1;
>
> n1.write= "concepts";
>
> }
>
> However, if i try to compile it, i get a compiler error saying that
> "incompatible types in assignment". Whats strange is that if i set
> write as an integer, i don't get such a error and it compiles. Does
> something special need to be done with character strings and pointers?


<http://www.c-faq.com/>. Read all of section 6, "Arrays and Pointers".

--
Keith Thompson (The_Other_Keith) kst-u@mib.org <http://www.ghoti.net/~kst>
San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
We must do something. This is something. Therefore, we must do this.

gk245 04-20-2006 12:17 AM

Re: Pointer incompatible type assignment to character.
 
Keith Thompson formulated on Wednesday :
> gk245 <topsoil@mail.com> writes:
>> I have something like this:
>>
>> #include <stdio.h>
>>
>> main ()
>> {
>> struct line
>> {
>> char write[20];
>> char read[20];
>>
>> struct line *next;
>> };
>>
>> struct line n1;
>>
>> n1.write= "concepts";
>>
>> }
>>
>> However, if i try to compile it, i get a compiler error saying that
>> "incompatible types in assignment". Whats strange is that if i set
>> write as an integer, i don't get such a error and it compiles. Does
>> something special need to be done with character strings and pointers?

>
> <http://www.c-faq.com/>. Read all of section 6, "Arrays and Pointers".


Thx for the link and the help guys. ^^



Chad 04-20-2006 03:14 AM

Re: Pointer incompatible type assignment to character.
 
> This is probably the usual confusion around arrays and pointers. You
> cannot treat an array "as if" it was a pointer in the left part of an
> assignment. Array names "decay" to pointers (to their first element)
> when they are in the right part of an assignment, but the reverse is not
> true.
>


Okay, I'm confused. Then how come something like this works.

include <stdio.h>
#define BUF 6

int main(void) {
char arr[BUF] = "la";

printf("the value is: %s\n", arr);

return 0;
}


Chad

$gcc -Wall arr.c -o arr
$./arr
the value is: la


But something like this:

include <stdio.h>
#define BUF 6

int main(void) {
int arr[BUF] = "la";

printf("the value is: %s\n", arr);

return 0;
}


produces
$gcc -Wall arr.c -o arr
arr.c: In function `main':
arr.c:5: error: invalid initializer
arr.c:7: warning: char format, different type arg (arg 2)


Chad 04-20-2006 03:25 AM

Re: Pointer incompatible type assignment to character.
 
> This is probably the usual confusion around arrays and pointers. You
> cannot treat an array "as if" it was a pointer in the left part of an
> assignment. Array names "decay" to pointers (to their first element)
> when they are in the right part of an assignment, but the reverse is not
> true.
>


Okay, I'm confused. Then how come something like this works.


#include <stdio.h>
#define BUF 6

int main(void) {
char arr[BUF] = "la";

printf("the value is: %s\n", arr);

return 0;

}


$gcc -Wall arr.c -o arr
$./arr
the value is: la

But something like this:

#include <stdio.h>
#define BUF 6

int main(void) {
int arr[BUF] = "la";

printf("the value is: %s\n", arr);

return 0;

}

produces
$gcc -Wall arr.c -o arr
arr.c: In function `main':
arr.c:5: error: invalid initializer
arr.c:7: warning: char format, different type arg (arg 2)

Chad


sweety.rathore@gmail.com 04-20-2006 03:54 AM

Re: Pointer incompatible type assignment to character.
 
Integer arrays cannot be assigned strings, you can assign one character
at a time to the array--

like arr[0]='l';
arr[1]='a';

Because when characters are assigned to integers, theri ascii value
gets transferred, but the ascii value of strings cannot be calculated.


Old Wolf 04-20-2006 03:57 AM

Re: Pointer incompatible type assignment to character.
 
Chad wrote:
>> Array names "decay" to pointers (to their first element) when they
>> are in the right part of an assignment, but the reverse is not true.

>
> Okay, I'm confused. Then how come something like this works.
>
> char arr[BUF] = "la";


This is not an assignment; it is an initialization. Some
programming languages use a different symbol for initialization
than they do for assignment. But C uses the equals sign for both.

In the initialization case, it means that "la" is an initializer for
arr. The C standard defines specifically that arrays of char can
be initialized from string literals.

> int arr[BUF] = "la";


Other arrays can only be initialized by an initializer list, eg:
int arr[BUF] = { 1, 2 };

The case of initializing from a string literal is only for arrays of
char.


Peter Shaggy Haywood 04-22-2006 05:37 AM

Re: Pointer incompatible type assignment to character.
 
Groovy hepcat Ian Collins was jivin' on Thu, 20 Apr 2006 11:06:02
+1200 in comp.lang.c.
Re: Pointer incompatible type assignment to character.'s a cool scene!
Dig it!

>gk245 wrote:
>> struct line
>> {
>> char write[20];
>> char read[20];
>> struct line *next;
>> };
>>
>> struct line n1;
>>
>> n1.write= "concepts";


[Snipage.]

>They are different. You have declared write as an array of 20 char and
>you are attempting to assign a pointer to const char to it.


No, he's trying to assign a pointer to char to it. There is no const
qualification on a string literal. It's not modifiable, but not const
qualified either.

--

Dig the even newer still, yet more improved, sig!

http://alphalink.com.au/~phaywood/
"Ain't I'm a dog?" - Ronny Self, Ain't I'm a Dog, written by G. Sherry & W. Walker.
I know it's not "technically correct" English; but since when was rock & roll "technically correct"?


All times are GMT. The time now is 08:26 AM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.