- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建一个函数,使用指针将一个数组复制到另一个数组中。我想添加以下条件:如果目标数组较小,则循环必须中断。
所以基本上它可以工作,但是如果我按如下方式对目标数组进行初始化,它就不会工作:
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
) 的数据类型的大小。
关于C : If as I understand 0 and '\0' are the same, 当我写 int my_array = {0}; 时,编译器如何知道数组的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56671562/
我是一名优秀的程序员,十分优秀!