C 试图将唯一的字读入文件,但内存分配有问题

C 试图将唯一的字读入文件,但内存分配有问题,c,arrays,string,pointers,memory-management,C,Arrays,String,Pointers,Memory Management,在下面的代码中出现了一个奇怪的问题,出于某种原因,buff is在while循环的每次迭代中都会覆盖arr。 代码意味着逐行读取文本文件,每行读取两个单词,并在“arr”数组中搜索每个单词。如果找到,将返回其索引,如果没有,则将其存储在下一个可用位置并返回索引 #include <stdio.h> #include <stdlib.h> #include <string.h> /*given a new word t, it searches in arr f

在下面的代码中出现了一个奇怪的问题,出于某种原因,buff is在while循环的每次迭代中都会覆盖arr。 代码意味着逐行读取文本文件,每行读取两个单词,并在“arr”数组中搜索每个单词。如果找到,将返回其索引,如果没有,则将其存储在下一个可用位置并返回索引

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*given a new word t, it searches in arr for it, if found returns the index
if not found returns first availble index and stores it */
int searchIndex(char * t,char **arr, int n){
    int i;
    for(i=0;i<=n;i++){
        if(arr[i]==NULL){
            arr[i]=t;
            return i;
        }
        if(strcmp(arr[i],t)==0)
        return i;

    }

}

int main(int argc, char* argv[])
{


   char *token =(char *)malloc(sizeof(char)) ;
   const char s[2] = " ";
   FILE *fp;
   char buff[255];
   int index;

   int V=3;  // Number of vertices in graph
   char ** arr = (char **)malloc(sizeof(char*)*V) ;
   fp = fopen(argv[1], "r");

//loop reads words from file and assigns each word a uniqe index in arr
   while(fgets(buff, 255, (FILE*)fp))

   {
      printf("arr in begining of iteration: \n");
      printf("%s \t",arr[0]);
      printf("%s \t",arr[1]);
      printf("%s \t",arr[2]);
      printf("\n");


    token = strtok(buff, s);
    printf("first token read: %s \t",token);
    index = searchIndex(token,arr,V);
    printf("first tokens index: %d \t",index);
    printf("\n");


     token = strtok(NULL, s);
     printf("second token read: %s \t",token);
     index = searchIndex(token,arr,V);
     printf("second tokens index: %d \t",index);
     printf("\n");
     printf("arr at end of iteration: \n");
     printf("%s \t",arr[0]);
     printf("%s \t",arr[1]);
     printf("%s \n",arr[2]);
     printf("\n"); 
  }
   fclose(fp);



    return 0;

}
#包括
#包括
#包括
/*给定一个新词t,它在arr中搜索它,如果找到,则返回索引
如果未找到,则返回第一个可用索引并存储它*/
整数搜索索引(字符*t,字符**arr,整数n){
int i;
对于(i=0;i此处

您分配
V
指针

在这里,您将传递已分配的内容以及指向的元素数量
arr

index = searchIndex(token,arr,V);
searchIndex()
中,您在分配时迭代一个多个元素:

int searchIndex(char * t,char **arr, int n){
  int i;
    for(i=0;i<=n;i++){
int searchIndex(char*t,char**arr,int n){
int i;

对于(i=0;i在每次迭代时,从文件中读入
buff
,在空格上进行标记化
buff
拆分,然后将指向标记化字符串的指针存储在
arr
中。注意:由于您正在存储指向
buff
中位置的指针,下次读入
buf
可能会覆盖
arr
中的数据

searchIndex()
中,您需要将令牌的副本存储在
arr
中。您可以使用
strdup()
对于这一点。另外,您在搜索循环中重复了太多的1次,这是另一个问题,但不是直接导致覆盖
arr
的问题。另外,一旦
arr
已满,函数不会返回显式值(可能是任何值!)-您可以返回-1以指示完整数组:

int searchIndex(char * t,char **arr, int n) {
    int i;
    for(i=0; i<n; i++) {
        if (arr[i] == NULL) {
            arr[i] = strdup(t);
            return i;
        }
        if (strcmp(arr[i], t) == 0)
            return i;
    }
    return -1;
}
int searchIndex(char*t,char**arr,int n){
int i;

对于(i=0;这是
for(i=0;我也是如此),在向世界展示代码之前,您可能希望更精确地缩进您的代码。
char*token=(char*)malloc(sizeof(char));
这行代码错误至少有三个原因,您能识别它们吗?应该是:char*token=(char*)malloc(sizeof(char*);?它应该是:char-token=(char)malloc(sizeof(char*));仅仅是
char*token;
感谢大家,仍然有一个问题,不管我做什么,arr大小保持在2,如果我尝试访问索引超过1,我会出错,有什么想法吗?
arr
大小实际上是3,根据变量
V
。最大索引是2。增加
V
以增加
arr
的大小。您需要解释在“不工作”中。这是编译错误还是运行时错误?您看到了什么输出?请注意,malloc不会初始化分配的内存,即
char**arr=(char**)malloc(sizeof(char*)*V);
可能不会导致V char*指针全部初始化为NULL。要么在调用malloc后初始化这些指针,要么像这样使用calloc:
arr=(char**)calloc(V,sizeof(char*));
谢谢大家!我不经常使用c,你们帮了我很大的忙!
int searchIndex(char * t, char ** arr, int n) {
  int i;
  for (i=0; i<n; i++) {
int searchIndex(char * t,char **arr, int n) {
    int i;
    for(i=0; i<n; i++) {
        if (arr[i] == NULL) {
            arr[i] = strdup(t);
            return i;
        }
        if (strcmp(arr[i], t) == 0)
            return i;
    }
    return -1;
}