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

问题描述 投票:10回答:6

这一直困扰着我。

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

当我编译时,我收到此错误:

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

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

c arrays string initialization assign
6个回答
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.");

5
投票

me.name = "nikol";错了!!你需要使用strcpy()

当你做x = "Some String"时,实际上你将静态字符串"Some String"的起始地址放入变量x。在您的情况下,name是一个静态数组,您无法更改地址。你需要的是将你的字符串复制到已分配的数组name。为此,请使用strcpy()


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定义的地址,而不是重新分配name本身。

*假设sizeof(int)是4并且结构没有填充,当然......


0
投票

初始化:

char name[15]

正在创建一个15字节的char数组。

“nikol”是一个字符串文字,类型为“char *”,即指向字符串的指针。它们是不兼容的类型。您需要将字符串复制到数组中,如下所示:

strcpy(me.name, "nikol")

-1
投票

使用strcpy()函数(string.h库):)

main(){
struct person{
       char name[15];
       int age;
};
struct person me;
strcpy(me.name,"nikol");
}

-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
© www.soinside.com 2019 - 2024. All rights reserved.