Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在字符串和数组类型char不可赋值的情况下,数组的固定大小和动态大小存在问题_Arrays_C_String - Fatal编程技术网

Arrays 在字符串和数组类型char不可赋值的情况下,数组的固定大小和动态大小存在问题

Arrays 在字符串和数组类型char不可赋值的情况下,数组的固定大小和动态大小存在问题,arrays,c,string,Arrays,C,String,我对以下程序的编译所显示的输出和错误并不感到困惑 案例1 在本例中,我没有固定char变量数组的大小。但在声明过程中指定一个值,它就很容易工作。我已经读到在数组的情况下不能使用赋值运算符。但在这里它起作用了。我不知道怎么做 #include <stdio.h> int main() { char str[] = "programming"; //dynamic size of array printf("%s", str);

我对以下程序的编译所显示的输出和错误并不感到困惑

案例1 在本例中,我没有固定char变量数组的大小。但在声明过程中指定一个值,它就很容易工作。我已经读到在数组的情况下不能使用赋值运算符。但在这里它起作用了。我不知道怎么做

#include <stdio.h>

int main()
{
    char str[] = "programming"; //dynamic size of array

    printf("%s", str);
    /*It works. Array size is dynamic as well as array bounded variable with char data type is not assignable but it works here. Don't know how? */
}
#包括
int main()
{
char str[]=“编程”;//数组的动态大小
printf(“%s”,str);
/*它可以工作。数组大小是动态的,并且数组有界变量和字符数据类型是不可赋值的,但它在这里工作。不知道如何工作*/
}
案例2 这种情况与上述情况类似,但在变量删除过程中未指定值,因此无效

#include <stdio.h>

int main()
{
    char str[]; //dynamic size of array

    str = "programming";
    printf("%s", str);
    /* It's not work. Error shown that " definition of variable with array type needs an explicit size or an initializer" */
}
#包括
int main()
{
char str[];//数组的动态大小
str=“编程”;
printf(“%s”,str);
/*无效。错误显示“数组类型变量的定义需要显式大小或初始值设定项”*/
}
案例3; 这是关于数组类型char不可赋值的真正错误

#include<stdio.h>

int main()
{
    char str[50];//fixed array size
    
     str="programming";
     printf("%s",str);
     //It's not working. 
     //compilor output is " array type 'char [50]' is not assignable"
     /*I understand it. It's correct error. but I don't understand error in other case.*/
}
#包括
int main()
{
char str[50];//固定数组大小
str=“编程”;
printf(“%s”,str);
//它不起作用了。
//编译器输出为“数组类型'char[50]'不可赋值”
/*我理解。这是正确的错误。但我不理解其他情况下的错误*/
}
案例4; 在本例中,我为带有数组的变量指定了一个值,但它不起作用

#include <stdio.h>

int main()
{
    char str[50];

    str[11] = "programming";
    printf("%s", str);
    //It's not work.
    /*Error by compilor is "assigning to 'char' from incompatible type 'const char [12]'
         str[11]="programming" */
}
#包括
int main()
{
char-str[50];
str[11]=“编程”;
printf(“%s”,str);
//这不是工作。
/*编译器的错误是“从不兼容的类型'const char[12]分配给'char'”
str[11]=“编程”*/
}
您感到困惑

    char str[] = "programming"; //dynamic size of array
这并不意味着
str
是动态调整大小的。这意味着
str
是根据您用来初始化它的字符串文本的长度调整大小的。它的大小是(并且始终是您调用它所包含的范围)您声明的字符串长度(在本例中为12个字符)

案例2也不是一种声明数组和不给它一个大小的方法。这会让你从编译器那里得到一个错误

    WhateverType a[];
是一个不完整的对象定义(数组缺少第一种情况下的长度),因此编译器会出错

案例3和案例4是相同的。在这种情况下,您不提供初始值设定项,但指定了数组长度。对象是完整的,不会出现错误。但这并不意味着数组是动态大小的。动态意味着您可以在运行时对其进行更改。类似于以下内容:

int f(char *s)
{
    char array[strlen(s)];
}
在这种情况下(非法,上一个标准除外,或者作为gcc扩展实现,例如),每次调用
f()
,通过计算字符串
s
的长度,可以得到不同的数组大小,作为参数传递给函数。这在许多C实现中是不允许的,因为在调用函数之前数组大小是未知的。在这种情况下,数组长度在编译时不是静态定义的……这意味着这个函数需要的本地存储量必须在每次函数调用时计算,而不是像前面的例子那样是一个常数。这并不意味着这是不可能的,但它需要在函数调用开始时进行一些计算。这是C的发明者不希望看到的

这种表示法是一种语法粘合剂,允许您通过提供初始值设定项来定义字符数组(这样您就不必计算字符串文字中的字符数来对数组进行尺寸标注),但它绝不意味着您下次可以使用不同的大小调用该函数或使用不同的数组大小(请注意,您使用了一个常量表达式来定义它——这是一个可以在编译时计算的表达式,而不是每次输入函数时)

另一方面,数组是不可赋值的。不是
char
数组,而是可以定义的任何单元格类型的数组。在C语言中,无法将数组作为一个整体对象引用。数组作为参数传递时会衰减为指针,如果在一个表达式中使用数组名称,则表示地址第一个元素的ss(与数组地址不同)在原来的C规范中,这是为了在单个C语句中禁用大的数组副本,所以最终的机器代码非常简单和高效。这是我的观点,但是这迫使程序员要三思而后行,考虑复制大量内存的缺点(以及它如何降低机器的速度)。也有人认为这是使C语言成为一种低级语言的一种方式,在这种语言中不可能进行聚合操作。嗯,这是真的,但它也赋予了C语言一部分美


在最后一个案例中(案例4)您提供了一个数组长度和一个初始值设定项。这意味着数组长度将得到遵守,字符串文字将被截断以适应数组。这并不意味着数组长度是动态的。

您将字符串初始化与字符串赋值混淆。字符串可以用作
char
数组的初始值设定项,但可能未分配给数组。如果要将字符串复制到数组,请使用
strcpy
。C中的数组永远不可分配。语法“[]”意味着编译器应该从数组的初始值设定项推断大小。非常感谢,先生。我了解您的观点,并且我不再怀疑数组的动态大小,因为大小不是动态的(在案例1中),它是固定的,因为编译器从初始值设定项推断数组的大小,并将其固定。请注意,我认为最后一个C标准允许动态声明本地数组(这意味着在过程激活时),以便在每次函数调用时具有不同的大小。在