我有一个由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数组缓冲区的指针。
我正在尝试从pixel []结构读取整数值,并将它们全部添加到单个缓冲区中。
我的问题是我在printf函数上收到一条警告,指出:线程1:EXC_BAD_ACCESS(code = EXC_I386_GPFLT)
在运行期间,程序将运行直到printf语句并在那里冻结
最佳答案
听起来您正在访问数组之一末尾的内存。bufpointer+=strlen(bufpointer)
和buffsize
组合看起来可疑。我假设您正在使用bufpointer
通过将每个snprintf
调用从上一个调用留下的空字节开始写入,从而将多个字符串合并到单个缓冲区中。在这种情况下,snprintf
的第二个参数应该是缓冲区中剩余的空间量,而不是缓冲区的总大小。例如,如果您有一个可容纳100个字符的缓冲区,并且第一个snprintf
调用写入10,则对于第二个调用,大小限制应为90,而不是100。
您尚未发布足够的代码来显示bufpointer
和buffsize
的初始化方式以及它们是否被循环更改,因此尚不清楚这是造成问题的原因,但我怀疑是这样。