宏参数导致C中的错误

时间:2013-07-11 14:26:37

标签: c

#include<stdio.h>
#include<string.h>

#define print(x){ \
                while(*x != -1){ \
                  printf("\n %d \n",*x); \
                  x++; \
                } 

void int_copy(int* ptrA, int* ptrB, int nbr)
{
    memcpy(ptrA,ptrB,nbr);
}

int main()
{
    int stringa[40] = {100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, -1};
    int stringb[40];

    memset(stringb, 0, sizeof(stringb));

    int *ptr;
    int *ptr1;
    int len = 0;

    ptr = stringa;
    ptr1 = stringb;

    while(*ptr != -1)
    {
        *ptr++;
        len++;
    }

    printf("\n len : %d \n",len);

    int_copy(stringa, stringb, len);

    print(ptr1)

    return 0;
}

我在尝试执行时遇到错误。

3 个答案:

答案 0 :(得分:3)

除了其他人向您指出的问题之外,我建议您计算宏中的开合括号数。

#define print(x){ \
            while(*x != -1){ \
              printf("\n %d \n",*x); \
              x++; \
            } 

答案 1 :(得分:2)

当您致电int_copy时,len的值将为0.

此外,int_copy中的代码已损坏,无法缩放要复制的字符数。

应该是:

void int_copy(int* ptrA, const int* ptrB, int nbr)
{
  memcpy(ptrA, ptrB, nbr * sizeof *ptrB);
}

memcpy()复制char以来,您必须按照int的大小进行扩展。

答案 2 :(得分:1)

你的问题是

void int_copy(int* ptrA,int* ptrB,int nbr){
     memcpy(ptrA,ptrB,nbr);
}

您将len确定为intstringa的数量,并将其作为nbr传递。但是在memcpy()中,它被解释为要复制的缓冲区长度,因此,只有stringa的第一部分被复制到stringb而不包括'-1'。更改为memcpy(ptrA,ptrB,nbr*sizeof(int))