gpt4 book ai didi

C : If as I understand 0 and '\0' are the same, 当我写 int my_array = {0}; 时,编译器如何知道数组的大小?

转载 作者:行者123 更新时间:2023-12-04 10:11:54 25 4
gpt4 key购买 nike

我正在尝试创建一个函数,使用指针将一个数组复制到另一个数组中。我想添加以下条件:如果目标数组较小,则循环必须中断。

所以基本上它可以工作,但是如果我按如下方式对目标数组进行初始化,它就不会工作:

int dest_array[10] = {0};

根据我的理解,它用相当于 '\0'(空字符)的 int 0 填充数组。所以这是我的问题:

在这种情况下,计算机如何知道数组大小或何时结束?

(以及如何比较作为参数传递的数组?)

void copy(int *src_arr, int *dest_arr)
{
// The advantage of using pointers is that you don't need to provide the source array's size

// I can't use sizeof to compare the sizes of the arrays because it does not work on parameters.
// It returns the size of the pointer to the array and not of of the whole array

int* ptr1;
int* ptr2;

for( ptr1 = source, ptr2 = dest_arr ;
*ptr1 != '\0' ;
ptr1++, ptr2++ )
{
if(!*ptr2) // Problem here if dest_arr full of 0's
{
printf("Copy interrupted :\n" +
"Destination array is too small");
break;
}

*ptr2 = *ptr1;
}

最佳答案

在 C 中,天生就不可能知道数组的长度。这是因为数组实际上只是一 block 连续的内存,传递给函数的值实际上只是指向数组中第一个元素的指针。因此,要真正知道函数内数组的长度,而不是声明该数组的函数,您必须以某种方式将该值提供给函数。两种常见的方法是使用指示最后一个元素的标记值(类似于 '\0' 的方式,空字符,按照惯例被解释为第一个字符,而不是 C 中字符串的一部分),或者提供另一个参数包含数组长度。

举一个很常见的例子:如果你写过任何使用命令行参数的程序,那么你肯定熟悉 int main(int argc, char *argv[]),它使用上述方法中的第二种方法,通过 argc 参数提供 argv 数组的长度。

对于本地 变量,编译器有一些方法来解决这个问题。例如,以下将起作用:

#include <stdio.h>

int main(){
int nums[10] = {0};
printf("%zu\n", sizeof(nums)/sizeof(nums[0]));

return 0;
}

10 打印到 STDOUT;然而,这只有效,因为 sizeof 操作是在本地完成的,并且编译器知道此时数组的长度。

另一方面,我们可以考虑将数组传递给另一个函数的情况:

#include <stdio.h>

int tryToGetSizeOf(int arr[]){
printf("%zu", sizeof(arr)/sizeof(arr[0]));
}

int main(){
int nums[10] = {0};
printf("%zu\n", sizeof(nums)/sizeof(nums[0]));

puts("Calling other function...");
tryToGetSizeOf(nums);

return 0;
}

这最终会将以下内容打印到 STDOUT:

10
Calling other function...
2

这可能不是您期望的值,但这是因为方法签名 int tryToGetSizeOf(int arr[]) 在功能上等同于 int tryToGetSizeOf( int *arr)。因此,您将整数指针 (int *) 的大小除以单个 int 的大小;而当您仍在 main() 的本地上下文中(即最初定义数组的位置)时,您将分配的内存区域的大小除以内存区域被划分为 (int) 的数据类型的大小。

An example of this available on Ideone .

关于C : If as I understand 0 and '\0' are the same, 当我写 int my_array = {0}; 时,编译器如何知道数组的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56671562/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com