0

我正在编写一个非常简单的字符串反转函数,

void reverse(char *data) {
    int length = 0,i;   
    char *temp,temp1[100];
    temp = data;
    length = strlen(temp);
    printf("length %d\n", length);
    for(i=length-1; i>=0; i--) {
        temp1[i] = *temp;
        printf("data[%d] = %c\n",i,temp1[i]);
        printf("%c\n",*temp);
        temp++;
    }
    temp1[length] = '\0';
    printf("data %s\n", temp1);
    //strcpy(data,temp1); // works even outside this function, offcourse it must
    data = temp1;   //works inside this function, but not outside this function
    printf("data %s\n", data);
}

int main()
{   
    int length1 = 0;
    char data1[100] = "I am megharaj from india";
    printf("data1 %s\n", data1);
    reverse(data1);
    printf("reversed\n");
    printf("data1 %s\n", data1);    
    return 0;
}

数据 = temp1; 这适用于反向功能,但不适用于主要功能。是的,这是默认设置,所以一旦它出现在函数之外,它就不会出现在堆栈中,但是为什么在主函数中 data1 打印字符串“我是来自印度的 megharaj”,我期待它打印垃圾值,因为我有一些东西已分配并且不再存在,因此它必须打印垃圾值。为什么它保留其先前的地址。

4

3 回答 3

0

temp是在您的函数data中本地放置在堆栈上的内容的副本。reverse从最严格的意义上讲,C 中的所有内容都是按值传递的。当我们通过值传递时,我们将变量的副本传递给函数。它将数组地址的值复制到函数中。

数据 = temp1; 这适用于反向功能,但不适用于主要功能。是的,这是默认设置,所以一旦它出现在函数之外,它就不会出现在堆栈中

这不是唯一的原因,temp1是一个反向的本地数组,你不能在你的reverse函数之外访问它(因为它不是全局可见的reverse)。

所以有2个数组

 +---+---+---+---+--+---+---+
 | I am megharaj from india |
 +---+---+---+---+--+---+---+ data1 in main

以上内容在执行后被销毁main

 +---+---+---+---+--+---+---+
 | I am megharaj from india |
 +---+---+---+---+--+---+---+ temp1 in reverse

以上内容在执行后被销毁reverse

于 2013-11-06T07:15:20.827 回答
0

您有 2 个数组,Data1并且Temp1. 和两个指针DataTemp
最初进入函数后,Data和都Temp指向 的第一个元素Data1
然后你填写Temp1使用Temp作为索引。
然后你把Data指向Temp1
现在,如果你 print Data,你实际上是在打印 的元素Temp1,所以你会看到反转的字符串。
注意,Data1在这个过程中永远不会改变。
当您退出函数时DataTempTemp1不存在,因为它们超出了范围。Data1仍然存在,因为它的范围是函数 main()
从函数返回后,您正在打印Data1,它仍然保留您设置的初始值,它永远不会更改或销毁。这就是为什么,你看不到垃圾价值。

于 2013-11-06T07:29:04.323 回答
0

temp1,data1是两个数组。

tempdata只是两个指针。

当你调用函数reverse(data1);

the pointer data starts to point the array data1.

完成反向核心操作后,您正在做

data = temp1;

您的指针数据离开数组 data1 并开始指向 temp1 的位置。

当你这样做printf("data %s\n", data);意味着你正在使用指针数据打印 temp1 数组的内容。这并不意味着阵列的内容data1发生了变化。

所以在离开函数后,作为未data1更改的内容,它们也会打印出来。

于 2013-11-06T10:29:17.423 回答