这一直困扰着我。
struct person {
char name[15];
int age;
};
struct person me;
me.name = "nikol";
编译时我收到此错误:
我在这里错过了一些明显的东西吗?错误:从'char *'类型分配类型'char [15]'时出现不兼容的类型
答案 0 :(得分:16)
阵列是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.");
答案 1 :(得分:5)
me.name = "nikol";
错了!你需要使用strcpy()
执行x = "Some String"
时,实际上是将静态字符串"Some String"
的起始地址放入变量x
。在您的情况下,name
是一个静态数组,您无法更改地址。您需要的是将字符串复制到已分配的数组name
。为此,请使用strcpy()
。
答案 2 :(得分:3)
首先,您需要了解以下几点:
因此,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
定义的地址,而不是重新分配{ {1}}本身。
*假设name
为4且结构未填充,当然......
答案 3 :(得分:0)
初始化:
char name[15]
正在创建一个15字节的char数组。
“nikol”是一个字符串文字,类型为“char *”,即指向字符串的指针。它们是不兼容的类型。您需要将字符串复制到数组中,如下所示:
strcpy(me.name, "nikol")
答案 4 :(得分:0)
您首先必须了解内存分配如何在数组中工作。
声明数组的名称时,该名称实际上用作指针 并指向数组的第一个元素。
struct person {
char name[15];
int age;
};
此处 name 指向数组第一个元素的内存地址,即 name [0] 。 您已经声明了字符数组,因此每个内存块的大小为1个字节。而且 name 也指向内存的1个字节。
struct person me;
me.name = "nikol";
me.name =“ nikol”;将无法正常工作。您正在将5个字节的数据分配给1个字节的存储,并且也没有取消对指针变量的引用。 为了更好地理解,请尝试使用此代码
struct person me;
*me.name = 'n';
在这里我引用了指针 name 并分配了1个字节的数据。这段代码可以很好地工作
printf("%c" , me.name[0]);
输出将为n。
这就是为什么我们必须使用strcpy()函数的原因。 Strcpy()将字符串常量的每个字符分配给数组的每个内存块。这就是为什么它将起作用。
strcpy(me.name , "nikol");
答案 5 :(得分:-1)
使用strcpy()
功能( string.h
库):)
main(){
struct person{
char name[15];
int age;
};
struct person me;
strcpy(me.name,"nikol");
}
答案 6 :(得分:-1)
您试图更改数组指针的内存地址(通过给我me.name =“ nikol”),这是不可能的。数组名称(me.name)是固定指针,不能更改为指向字符串的新位置(“ nikol”),因为数组指针的内存地址位于该数组的第一个成员上。如果要在声明后分配一个字符串(me.name =“ nikol”),请改用外部指针* name,因为外部指针浮在数组外部,因此可以随时更改其值。
struct person {
char *name;
int age;
};
struct person me;
me.name = "nikol"; // no error