在C中,为什么我不能在声明后将字符串赋值给char数组?

时间:2014-11-01 21:38:56

标签: c arrays string initialization assign

这一直困扰着我。

struct person {
       char name[15];
       int age;
};
struct person me;
me.name = "nikol";

编译时我收到此错误:

  

错误:从'char *'类型分配类型'char [15]'时出现不兼容的类型

我在这里错过了一些明显的东西吗?

7 个答案:

答案 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)

首先,您需要了解以下几点:

  • 在C中,文本字符串只是数组。
  • 在C中,数组变量基本上只是指针。

因此,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