【发布时间】:2015-08-22 06:55:09
【问题描述】:
我遇到以下问题。我创建了一个 char 数组,它代表一系列字符和数字——它旨在模拟从文本文件中读取或获取的字符串。然后我希望使用下面定义的“搜索”函数搜索这个字符串,只提取“H”之前的数字并分配给一个单独定义的整数数组。我发现当我使用 gdb 时,这个功能可以正常工作。然而,只有部分数组被返回——确切地说是前 8 个元素。谁能通过查看下面的代码来解释为什么会这样?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void search(char buffer[], int size, int array[]);
int main (void)
{
char buffer[1000];
memset(buffer, 0, sizeof(buffer));
buffer[0] = 2;
buffer[1] = 'H';
buffer[2] = 3;
buffer[3] = 'H';
buffer[4] = 6;
buffer[5] = 'H';
buffer[6] = 4;
buffer[7] = 'H';
buffer[8] = 6;
buffer[9] = 'H';
buffer[10] = 7;
buffer[11] = 'H';
buffer[12] = 11;
buffer[13] = 'H';
buffer[14] = 12;
buffer[15] = 'H';
buffer[16] = 17;
buffer[17] = 'H';
int* array ;
array = malloc(sizeof(buffer) * sizeof(int));
search(buffer, sizeof(buffer), array);
for(int i = 0, n = sizeof(array); i < n; i++)
{
printf("array[%d] = %d\n", i, array[i]);
}
free(array);
}
void search(char buffer[], int size, int array[])
{
int position = 0;
for (int i = 0; i < size; i++)
{
if(buffer[i] == 'H')
{
*(array + position) = buffer[i-1];
position++;
}
}
}
编译器输出如下:
array[0] = 2
array[1] = 3
array[2] = 6
array[3] = 4
array[4] = 6
array[5] = 7
array[6] = 11
array[7] = 12
可以看出,它缺少数组中的第九个位置 - 值 17。事实上,如果我将一组更大的数字和“H”放入缓冲区,我总是会返回一个大小为 8 的数组。为什么这是?任何帮助将不胜感激。
【问题讨论】:
-
您将
sizeof(buffer)传递给search(),而不是您使用的元素数量 - 18。 -
buffer[i-1];是i == 0时的未定义行为 -
@WeatherVane
sizeof(buffer)表示array的元素数。buffer[i-1];如果(buffer[i] == 'H') -
@BLUEPIXY 请仔细阅读我的 cmets。
-
@WeatherVane 您不需要传递您正在使用的元素数量。当
i == 0时,将无法访问buffer[i-1]。