C程序来增加传递的数组的每个元素

C程序来增加传递的数组的每个元素,c,arrays,pointers,C,Arrays,Pointers,C这里是新手。 我试图编写一个包含函数的程序,该函数接受一个数组指针,在主函数中传递的数组的每个元素都递增1。这就是我尝试过的: #include <stdio.h> #include <stdint.h> void array_incr(int8_t *, uint8_t); int main (void){ int8_t *arr[] = {0xAB, 0xCB, 0xC4, 0x84}; array_incr(arr, sizeof(arr)/s

C这里是新手。
我试图编写一个包含函数的程序,该函数接受一个数组指针,在主函数中传递的数组的每个元素都递增1。这就是我尝试过的:

#include <stdio.h>
#include <stdint.h>

void array_incr(int8_t *, uint8_t);

int main (void){
    int8_t *arr[] = {0xAB, 0xCB, 0xC4, 0x84};
    array_incr(arr, sizeof(arr)/sizeof(arr[0]);
    int i;
    for (i = 0; i < 4; i++)
        printf("%d", arr[i]);
}

void array_incr(int8_t *arr, uint8_t len){
    int i;
    for(i=0; i<len; i++)
        arr[i]++;

}
#包括
#包括
空数组增量(int8\u t*,uint8\u t);
内部主(空){
int8_t*arr[]={0xAB,0xCB,0xC4,0x84};
数组增量(arr,sizeof(arr)/sizeof(arr[0]);
int i;
对于(i=0;i<4;i++)
printf(“%d”,arr[i]);
}
无效数组增量(整数数组,整数数组){
int i;

对于(i=0;i首先,最好包括所述的警告和错误列表,但对于这样一个小程序,基本上是可以的

在这件事上,你声明你的数组是错误的;它应该是
int8\u t arr[]
(你包括了一个额外的*)。你想要的是一个整数数组,而不是指向整数数组的指针,也不是指向整数的指针数组(你不能像那样初始化前者)

sizeof
的工作方式与您想象的不同。它返回变量或类型在内存中占用的字节数。例如,在大多数现代系统上
sizeof(int)
返回4,类似于
int a=1;sizeof(a)
,就像
sizeof(arr)一样
在您的例子中。
arr
不是数组,它是指向数组的指针,因此从技术上讲它是一个int(因此是4个字节)。如果数组要更改,您必须创建一个附加变量并手动保持数组的大小


编辑:试过了,似乎有效。我记得它没有,但显然有效…

确实存在多个问题:

  • 声明中的类型不正确
    int8_t*arr[]={0xAB,0xCB,0xC4,0x84}
    :您应该删除
    *
    ,因为
    arr
    是一个数字数组,而不是指针数组。此外,如果值大于127,这是类型
    int8_t
    的最大值,您应该使用
    uint8_t
    或更大的类型

  • 缺少
    数组的末尾\u incr(arr,sizeof(arr)/sizeof(arr[0]);

  • printf(“%d”,arr[i])
    输出语句中没有
    \n
    。值将以单个数字序列(和负号)的形式出现,因为类型
    int8\t
    的值实际上是负数)

以下是更正的版本:

#include <stdio.h>
#include <stdint.h>

void array_incr(uint8_t *, uint8_t);

int main(void) {
    uint8_t arr[] = { 0xAB, 0xCB, 0xC4, 0x84 };
    array_incr(arr, sizeof(arr) / sizeof(arr[0]));
    int i;
    for (i = 0; i < 4; i++)
        printf("%d\n", arr[i]);
}

void array_incr(uint8_t *arr, uint8_t len) {
    int i;
    for (i = 0; i < len; i++)
        arr[i]++;
}
#包括
#包括
空数组增量(uint8\u t*,uint8\u t);
内部主(空){
uint8_t arr[]={0xAB,0xCB,0xC4,0x84};
数组增量(arr,sizeof(arr)/sizeof(arr[0]);
int i;
对于(i=0;i<4;i++)
printf(“%d\n”,arr[i]);
}
无效数组增量(uint8\u t*arr,uint8\u t len){
int i;
对于(i=0;i
“寻求调试帮助的问题(“为什么此代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现这些问题所需的最短代码。没有明确问题说明的问题对其他读者没有用处。请参阅:。”一堆警告是因为
int8\t*arr[]
是指针数组,而不是(小)整数数组。删除
*
。变量
min\u ptr
未使用,应该删除。您可能不应该同时使用
sizeof(arr)/sizeof(arr[0])
和4表示数组的大小;表达式优于数字。为什么要计算数组的大小来调用
数组_mod
,但要硬编码以打印它?错误和警告告诉您出了什么问题。请尝试阅读它们!(另外,在开发新代码时,始终在启用所有警告的情况下编译-将
-Wall-pedantic
添加到命令行。)并且
0xC4
超出了
int8\t
的范围(通常为-128…127)“在大多数现代系统上,sizeof(int)返回4”-对于一个明显的初学者来说,这是错误和危险的。现在有许多现代16位系统和一些系统,例如16位或32位/字节。指针不是
int
!它甚至不是整数。不确定这个额外变量的意思。
sizeof
?表达式是代码中最好的部分。好的,我应该改变它。另外,由于我进行了测试,而且
sizeof(arr)
确实产生了正确的结果,所以似乎我错了两倍。我不知道这是从哪里得到的,对不起。。。