2016-09-25 65 views
0

的指针和级联我得到两个字符串的连接时的“C”被打印在function.But内时,返回指针的地址和“i”被印刷内部主,输出不正确。传字符阵列的串

#include <stdio.h> 

char* comp(char* s,char* t) 
{ 
int count=0; 
char *c; 
c=s; 
while(*s!='\0') 
    s++; 
for(;*t!='\0';t++,s++) 
    *s=*t; 
return c; 
} 

int main(){ 
char* i; 
char c[]= "hello there"; 
char f[]="world"; 
i=comp(&c,&f); 
printf("%s",i); 
return 0; 
} 
+2

可能重复的[如何在C中打印内存地址](http://stackoverflow.com/questions/30354097/how-to-printf-a-memory-address-in-c) – wasthishelpful

+1

要清楚,你*不是*“返回指针变量的地址”。如果你这样做了,你会做'return&c',你(幸好)不这样做。你只是简单地返回一个指针。此外,您正在用错误的参数调用该函数。不要在调用中使用的地址的操作,你只需要把这个数组作为是和编译器将其衰减到指针到他们的第一要素。对于例如数组'f'表达式'f'和'&f [0]'是相同的。这里的表达式&f实际上是错误的。 –

+0

你试图将数据追加到一个最有可能只读存储器位置。即使它不是只读的,你仍然要经过分配的内存,这是未定义的行为。当存在未定义的行为时,你不会问“为什么”。 –

回答

3

问题,我看到:

问题1

你是不是空在comp终止连接字符串。

char* comp(char* s,char* t) 
{ 
    int count=0; 
    char *c; 
    c=s; 
    while(*s!='\0') 
     s++; 
    for(;*t!='\0';t++,s++) 
     *s=*t; 

    // Need this 
    *s = '\0'; 
    return c; 
} 

问题2

您错误地调用该函数。您需要使用:

i=comp(c, f); // Not comp(&c, &f) 

问题3

最严重的问题是,你写了记忆,你不应该:

当你使用:

char c[]= "hello there"; 
char f[]="world"; 

c有足够的内存来存放字符串"hello there"f有足够的内存容纳字符串"world"。试图超出这些限制是因为未定义的行为。你可以使用:

char c[100]= "hello there"; 
char f[]="world"; 
i = comp(c, f); 

这将是确定,因为c具有保持连接字符串足够的空间。

更新,响应OP的评论

char c[]= "hello there"; 

等同于:

char c[12] = {'h', 'e', 'l', 'l', 'o', ' ', 't', 'h', 'e', 'r', 'e', '\0'}; 

追加"world"到相当于执行以下操作:

c[11] = 'w'; 
c[12] = 'o'; 
c[13] = 'r'; 
c[14] = 'l'; 
c[15] = 'd'; 
c[16] = '\0'; 

那导致未定义的行为或者因为您正在使用越界索引编写数组元素。即使使用出界索引来访问数组的元素也会导致定义的行为。

+0

谢谢!但是,你能否详细解释一下问题3。我对c中的内存管理没有太多的想法,但我真的很想学习。 –