为什么2个不同的字符串在C中具有相同的地址?

时间:2017-10-20 12:38:34

标签: c local-variables

下面的代码和示例csv文件。

我写的程序是一个csv阅读器。在while循环中,我将文件的行作为字符串获取,然后使用sscanf我提取存储在局部变量中的数据。

我有两个字符串,我存储在char * name和char * surname中,但它们碰巧有相同的地址:

Printing description of name:
(char *) name = 0x000000010004da78 "Bob"
Printing description of surname:
(char *) surname = 0x000000010004da78 "Bob

我不明白为什么因为它们有不同的变量名。

我希望能回答这个问题,但这不是我的问题:Temporary C strings have same address

我重命名了变量并重新构建了.exe(使用Xcode),但问题仍然存在。知道为什么会出现这个问题吗?

由于

代码

void readFileTest(FILE* *pFile, TTest* *pRootTest)
//Reads the content of the file, line by line
{
    int count=0;
    char string[MAX_SIZE];
    TTest *pTestCurrent=NULL, *pPrevious=NULL;

    //Reads first line (wich is the label line)
    fgets(string, MAX_SIZE, *pFile);
    printf("Column labelling : %s\n", string);

    //allocating pointer
    pTestCurrent=malloc(sizeof(TTest));
    pTestCurrent->ID=0;
    pTestCurrent->name="";
    pTestCurrent->surname="";
    pTestCurrent->mean=0.0;
    pTestCurrent->pNext=NULL;
    pTestCurrent->pPrevious=NULL;

    (*pRootTest)=pTestCurrent;
    pPrevious=pTestCurrent;

    //Extracts data of each line and stores it in a node
    while(fgets(string, MAX_SIZE, *pFile)) //reads line by line until the EOF
    {
         int identification=0;
         char* name;
         char* surname;
         float mean=0.0;

         //Counts iterations (lines) in the file
         count+=1;
         printf("Iteration n°%d\n", count);

         //Extracts data of the line in variables
         sscanf(string, "%d,%[^,],%[^,],%f", &identification, name, surname, &mean);

        //Assign data in variables to node in pTestCurrent
         pTestCurrent->ID=identification;
         pTestCurrent->name=name;
         pTestCurrent->surname=surname;
         pTestCurrent->mean=mean;

         //Displays data in node
         printf("Line content (stored in pTestCurrent) :\nID : %d\nNAME : %s\nSURNAME : %s\nMEAN : %f\n\n", pTestCurrent->ID, pTestCurrent->name, pTestCurrent->surname, pTestCurrent->mean);

         if(pTestCurrent==NULL)
         {
             printf("ERROR : pointer pTestCurrent is NULL, the programm will exit now\n");
             EXIT_FAILURE;
    }

         //Refresh pointer
         pTestCurrent->pNext=malloc(sizeof(TTest));
         pTestCurrent=pTestCurrent->pNext;
         pTestCurrent->pPrevious=pPrevious;
         pTestCurrent->pNext=NULL;
         pPrevious=pTestCurrent;
         }
};

示例文件:

ID,NAME,SURNAME,MEAN
1,Smith,Bob,4.32
2,Mason,Jack,9.21
3,Gabe,John,2.67

2 个答案:

答案 0 :(得分:2)

这里的问题是,在while循环内,您使用了未初始化的指针。这些指针不能保证指向有效的任何地方,并且您正在尝试通过它们访问内存位置指针。这会导致undefined behavior

解决方案:在将它们作为参数传递给sscanf()之前,您需要确保它们指向一些可由您的进程访问的有效内存。

答案 1 :(得分:1)

你犯了两个错误:

  1. sscanf

  2. 时,您的内存不足
  3. 您不会复制扫描的值。

  4. 第一个:

        sscanf(string, "%d,%[^,],%[^,],%f", &identification, name, surname, &mean);
    

    此处namesurname只是指向char的指针,但它们并不指向程序的内存(它们未经初始化并且可以指向任何位置。可能会出现分段错误)。而是,做:

        char name[64], surname[64];  // or any proper size for the names
    

    您现在拥有sscanf的有效内存。

    其次,当您将扫描的数据复制到结构中时,必须在结构中为数据分配内存。仅使用pTestCurrent->name=name;,您可以在结构的名称字段中将指针放置到name,但不要复制数据。因此,在您的下一个sscanf,您将只覆盖数据。而是,做:

        pTestCurrent->name= malloc(strlen(name)+1);
        strcpy(pTestCurrent->name, name);