数组越界,索引-1

时间:2014-11-18 22:45:01

标签: c arrays char indexoutofboundsexception

我基本上想要根据给定的数字存储学生姓名数组。例如,如果用户想要插入5个名称,那么数组大小将为5.如果用户想要插入10个名称,则数组大小将为10.

我有一个像这样的方法来为数组中的特定元素设置名称。

void setNames(char *names){
     strcpy(name[i], names);
}

事情是,我该如何进行数组绑定检查?我听说你只能在索引为-1时添加。

4 个答案:

答案 0 :(得分:1)

编辑(因为OP表示他实际上想要C):

C回答

您可以做的是创建一个char数组:

char [N][name_length]

其中N - 数字“用户想要”(我假设用户将以某种方式将其输入到您的程序中),name_length - 名称可以具有的最大长度(C字符串,即以空字符结尾的字符串)。

或创建一个自己的struct数组(每个都包含一个单独的名称,也可能包含其他一些信息)。


C ++回答

在C ++中执行此操作的典型方法是使用std::vector<std::string>(假设您只想将名称存储为std::string)。

然后使用push_back()函数添加新元素。而且,由于vector在C ++中实现为动态数组,因此您不必进行绑定检查。

答案 1 :(得分:1)

数组不保持自己的大小,你必须为它们做到这一点。这就是为什么向量更容易处理的原因之一,以及为什么每个人都会说“wtf,原始数组?使用向量”。数组只是一块连续的内存,就是这样。向量包含一个数组,并允许您在某种程度上像数组一样使用它,但它会为您处理大量的内务处理细节。

无论如何,如果你真的想使用原始数组,那么你需要传递大小信息。 C字符串是一个以null结尾的数组 - 只是一个普通的旧数组,但最后一个元素是\0。这样你就可以在不知道它的大小的情况下从中读取它,只是不要读过末尾的空字符(龙在那里)。

答案 2 :(得分:0)

使用C / C ++编程时(除非使用C ++ 11或更新版本),您将操作数组作为指针。这意味着除非你保存,否则你不会知道数组的大小。 char str[10]的真正含义是str's address + 10 * sizeof(char)。你在这里直接处理记忆。

如果你想要一个高级方法,请看一下C ++ 11。 std::arraystd::vector适合您。从documentation开始,查看std::array的定义方式:

template <
    class T,
    std::size_t N
> struct array;

这意味着它存储自己的大小并具有有用的功能,例如size()at()back()等。

答案 3 :(得分:0)

C代码需要跟踪另一个变量中的数组大小。

typedef struct {
  char **name;
  size_t n;
} Names_T;

void Names_Set(Names_T *names, size_t index, const char *name) {
  // See if it is a special value and then append to the array
  if (index == (size_t) -1) {
    index = names->n;
  }
  if (index >= names->n) {
    size_t newsize = index + 1;
    // OOM error handling omitted
    names->name = realloc(names->name, newsize * sizeof *names->name);
    while (names->n < newsize) {
      names->name[names->n++] = NULL;
    }
  }
  char *oldname = names->name[index];
  names->name[index] = strdup(name);
  free(oldname);
}

void Names_Delete(Names_T *names) {
  while (names->n > 0) {
    names->n--;
    free(&names->name[names->n]);
    names->name[names->n] = NULL;
  }
  free(names->name);
  names->name = NULL;
}

int main(void) {
  Names_T names = { NULL, 0 };
  Names_Set(&names, 3, "Sam");              // set array element 3
  Names_Set(&names, (size_t) -1, "Thers");  // Append to array
  Names_Delete(&names);
  return 0;
}