C++ 为什么函数头中的更改会导致指针赋值为not函数?

C++ 为什么函数头中的更改会导致指针赋值为not函数?,c++,string,linked-list,C++,String,Linked List,当我在调试Testthis=&*Look_时,将函数头中的最后一个参数从char Findthis[64]更改为char*Findthis作业中断。Look_in有一个内存地址和成员值,但Testthis没有被分配指针位置。为什么会这样 struct Node * ProbableMatch(struct Node * Look_in, int MaxNodes, char Findthis[64]) { char Findit[64]; strcpy_s(Findit,64,F

当我在调试
Testthis=&*Look_时,将函数头中的最后一个参数从
char Findthis[64]
更改为
char*Findthis
作业中断。Look_in有一个内存地址和成员值,但Testthis没有被分配指针位置。为什么会这样

struct Node * ProbableMatch(struct Node * Look_in, int MaxNodes,
char Findthis[64])
{
    char Findit[64];
    strcpy_s(Findit,64,Findthis);
    struct Node * CurrentHighProb;
    CurrentHighProb=new(Node);
    struct Node * Testthis;
    Testthis=new(Node);
    Testthis=&*Look_in;

    while((Testthis) || (i!=(ccounter-1)))
{ //This Testthis does not cause exception
    string str1;
    string str2;

    n1=sizeof(Testthis->NAME);
    n2=sizeof(Findit);

    n=0;
    while((Testthis->NAME[n]!='\0') && (n<=n1)){
              //While Testthis->NAME here causes the exception
         if(Testthis->NAME[n]=='-'){Testthis->NAME[n]=' ';} 
        n++;
    }//end of while

看起来更像C代码。为什么要使用C字符串和std字符串?在任何情况下,您的错误看起来都是无关的。
Testthis=&*Look_in
之前的赋值是无用的(更不用说
new
调用泄漏内存了)。在这种情况下,没有理由首先取消引用您的
Look\u In
节点,然后获取地址。您应该能够简单地将该语句更改为
Testthis=Look\u in

但是,如果这是一个运行时错误,请确保
Look_in!=NULL
或未在其他地方删除

看起来你对指针有点困惑;下面是一个简短的总结

指针指向存储某些值的内存位置。因此,当您声明一个指针并为其分配某个内存位置时,您是在告诉该指针在内存中的何处查找某个项。当您取消引用一个有效的非空指针时,您可以获得该内存位置所持有的值。比如说,

Node x[64]; // An array of 64 nodes
Node * t = x; // t points to element 0 of x. Therefore, changing values of x changes values of t and changing values of t changes values of x
此外,内存分配/释放是另一回事。堆栈内存(如上两种声明所述)由操作系统管理。但是,堆分配由您决定(即
new
/
delete

堆栈和堆之间的最大区别在于堆内存超过了函数的生命周期。例如,每个函数都有自己的堆栈框架来声明变量。但是,当函数退出时,堆栈帧将被释放。但是,堆内存可以保存不是单个函数生存期独占的值

一个简单的例子是:

int* giveMeAnInt()
{
  int x;
  return &x;
}
在上面的函数中,我们声明一个局部变量,并尝试将其地址作为指向该值的指针返回。但是,在返回后,由于函数已结束,该值将从堆栈中弹出。要正确执行此操作,您必须:

int* giveMeAnInt()
{
  int* x = new int;
  return x;
}
第二个示例在堆上声明一个变量并返回其地址。但别忘了,如果您使用
new
,以后必须
删除它。另一个快速示例(使用上述代码的工作版本,即示例2)

。。。
int*z=giveMeAnInt();
coutNAME)
因此问题不在于指针。如果要查找指针字符串中的字符数,则必须使用
strlen()
而不是
sizeof()


我们面临的问题是:数组和指针之间的区别。如果声明
char someArray[64]
,则
sizeof(someArray)==64
。但是,如果您声明
char*someArray
,那么
sizeof(someArray)==4
(因为
sizeof(char*)==4
,假设是32位机器。但现在,常量无关紧要),而不是实际的字符数。为了安全起见,您只需使用strlen(someArray)
,这将对两种声明都起到预期的作用。

Ok看起来像是std::string-To-char*转换导致了泄漏

切换到此处建议的向量选项:


问题消失了。稍后我将不得不跟踪实际内存,但我发现奇怪的是,字符串内存正好放在链表的开头旁边。

真让人讨厌。这是对C标记的乞求。请将您的代码简化为仅相关的代码,并正确设置格式。Testthis=new(Node);VS2010在我没有Testthis=new(节点)时抱怨;声明之后。我想这可能是由于自1998年我上一次编程以来的标准变化;并转换回传递char*,Testthis=&*Look_in;Findthis仍然不能作为指针使用,当它的字符Findthis[64]时没有问题。感谢指针上的指针:P但遗憾的是,这仍然不能解释我在这里的问题,正如您在这里看到的,列表不是空的,在这里,赋值没有发生。当Findthis是char Findthis[64]时,这个问题不会发生。Findthis和Testthis没有直接关系,因此我的原始问题是:您在哪里查看这些信息?当然,它必须在赋值语句出现之后。没有理由认为这一特定声明不起作用。例如,如果第257行没有完成执行,它将不会被赋值。我没有中断,当Findthis为char*Findthis时,系统异常会发生在该赋值上,当Findthis为char Findthis时,没有问题[64];尝试将这段代码移到更高的位置(可能在函数的顶部)——这仍然会引发异常吗?我觉得奇怪的是,一个简单的指针赋值会抛出一个异常(即使它是一个空指针,该行本身也不应该抛出任何东西)。顶部部分中唯一真正可能引发异常的可能是strcpy(即读取/写入未初始化或无效的内存)
Node * x = new Node;
// Do stuff with your node - it is on the heap, so it is persistent until you explicitly remove it
delete x;
int* giveMeAnInt()
{
  int x;
  return &x;
}
int* giveMeAnInt()
{
  int* x = new int;
  return x;
}
...
int * z = giveMeAnInt();
cout<< *z << endl;
delete z; // Free the memory allocated by the giveMeAnInt() function
...