printf导致EXC_BAD_ACCESS(代码= EXC_I386_GPFLT)警告并在运行时冻结

时间:2014-06-19 22:32:12

标签: c printf i386

我有一个由3个嵌套的for循环和一个if语句组成的函数,在其中我有:

int buffsize = valuex*3;
    //int buffsize = (LEDS+1)*3;
    char buffer[buffsize];
    init_buf(buffer, buffsize);
    // while(counter <= linecount){

    int x = 0;
    int y = 0;
    char *bufpointer=buffer;

    for (x=0; x<=valuex; x++) {

        for (y=0;y<=LEDS; y++) {

            for (int i=0; i<=linecount; i++) {

                if (pixels[i].y==y) {

                    snprintf(bufpointer+=strlen(bufpointer), buffsize, "%s%d%d%d",buffer, pixels[i].r,pixels[i].g, pixels[i].b );
                    printf("buffer contents: %s\n",buffer);


                }

            }
         printf("buffer contents: %s\n",buffer);  //placed for debugging
        }

    }



    /**************** buffer initialiser ********************/

    void init_buf(char *buf, size_t size){
    int i;
    for(i=0; i<size; i++){
        buf[i] = '0'; // int to char conversion
     }
    }

bufpointer是一个指向char数组缓冲区的指针。

我正在尝试从pixels [] struct读取整数值,并将它们全部添加到单个缓冲区中。

我的问题是我在printf函数中收到一条警告,说明:线程1:EXC_BAD_ACCESS(代码= EXC_I386_GPFLT)

在运行期间程序运行到printf语句并冻结在那里

1 个答案:

答案 0 :(得分:1)

听起来你正在通过一个阵列的末尾访问内存。

bufpointer+=strlen(bufpointer)buffsize相结合看起来很可疑。我假设您通过使每个bufpointer调用开始写入前一个调用留下的空字节来使用snprintf将多个字符串连接到单个缓冲区中。如果是这种情况,snprintf的第二个参数应该是缓冲区中剩余的空间量,而不是缓冲区的大小。例如,如果您有一个100个字符的空间缓冲区,并且第一个snprintf调用写入十个,那么对于第二个调用,大小限制应该是90,而不是100。

您还没有发布足够代码来展示bufpointerbuffsize的初始化方式以及它们是否被循环更改,因此不清楚这是你的问题的原因,但我怀疑它是。