这一直困扰着我。
struct person {
char name[15];
int age;
};
struct person me;
me.name = "nikol";
当我编译时,我收到此错误:
错误:从类型'char *'分配类型'char [15]'时出现不兼容的类型
我错过了一些明显的东西吗?
数组是C中的二等公民,他们不支持任务。
char x[] = "This is initialization, not assignment, thus ok.";
这不起作用:
x = "Compilation-error here, tried to assign to an array.";
使用库函数或手动复制每个元素:
#include <string.h>
strcpy(x, "The library-solution to string-assignment.");
me.name = "nikol";
错了!!你需要使用strcpy()
当你做x = "Some String"
时,实际上你将静态字符串"Some String"
的起始地址放入变量x
。在您的情况下,name
是一个静态数组,您无法更改地址。你需要的是将你的字符串复制到已分配的数组name
。为此,请使用strcpy()
。
首先,您需要了解以下几点:
因此,char mytext[12];
基本上只是声明一个名为mytext
的char指针,它存储数组/字符串的第一个(第零个)元素的地址。
因此,此代码有效:
#include <stdio.h>
int main(int argc, char *argv[])
{
const char a[] = "Hello";
const char *b = a;
printf("%s\n", b);
return 0;
}
这里需要注意的重要一点是,重新分配b
并不会改变它所指向的内容 - 它会改变它所指向的内容。
但是,在某些情况下,数组和指针的行为会有所不同。在上面的示例中,a
无法重新分配。如果你试试,you'll get an error。
回到原来的例子,这个结构:
struct person{
char name[15];
int age;
};
...可以被认为是一个19字节的结构*,其中前15个字节被指定用于存储字符串。 name
属性存储第一个字节的地址,因此您知道这15个字节在内存中的位置 - 您只需要在其中编写有用的东西。
这就是sprintf()
或strcpy()
等函数发挥作用的地方 - 它们将数据复制到name
定义的地址,而不是重新分配name
本身。
*假设sizeof(int)
是4并且结构没有填充,当然......
初始化:
char name[15]
正在创建一个15字节的char数组。
“nikol”是一个字符串文字,类型为“char *”,即指向字符串的指针。它们是不兼容的类型。您需要将字符串复制到数组中,如下所示:
strcpy(me.name, "nikol")
使用strcpy()
函数(string.h
库):)
main(){
struct person{
char name[15];
int age;
};
struct person me;
strcpy(me.name,"nikol");
}
您正在尝试更改数组指针的内存地址(通过提供me.name =“nikol”)这是不可能的。数组的名称(me.name)是一个固定的指针,不能更改为指向字符串的新位置(“nikol”),因为数组指针的内存地址位于该数组的第一个成员上。如果要在声明后指定一个字符串(me.name =“nikol”),请使用外部指针* name,因为外部指针会浮动到数组外部,因此可以在运行时更改其值。
struct person {
char *name;
int age;
};
struct person me;
me.name = "nikol"; // no error