2013-12-11 109 views
-2

我对以下C代码有点问题。如果我注释掉“线24”然后我会得到下面的输出:

aaaaaaaaaaaaaaaaaaaaaaaaa

,如果我不评论,我会得到如下:??

aaaaaaaaaaaaaaaaaaaaaaaaadƔLƔLƔF ?W'F'W'F'W'F'W'F'W'F'W'F'W'


有人可以告诉我为什么吗?

我使用Mac OS X 10.5.4和gcc

printf导致输出问题

void test(char* a , char* b); 

int main() 
{ 
    char * str = "aaaaaaaaaaaaaaaaaaaaaaaaa"; 
    char* str2 = malloc(4*sizeof(str)); 
    test(str , str2); 
    return 0; 
} 

void test(char* a , char* b) 
{ 
    int i = 0; 
    printf("\n########\n"); 
    for(i = 0 ; i < strlen(a) ; i++) 
    { 
     printf("%d" , i); /******** LINE 24 ********/ 
     b[i] = a[i];   
    } 

    printf("\n########\n"); 
    for(i = 0 ; i < strlen(b) ; i++) 
    { 
     printf("%c" ,*(b+i)); 
    } 
    printf("\n########\n"); 

} 



感谢您回复。

+2

如果你不给它一个0结尾的字符串,你认为'strlen(b)'应该返回什么? – 2013-12-11 16:11:59

回答

1

我看到你的代码的两个问题:的str2

首先分配:

char* str2 = malloc(4*sizeof(str)); // This will allocate 4 times the size of a char pointer. You cannot be sure that str will fit! 

秒的a复制到b。 您需要在b末尾添加一个字符串结束:

for(i = 0 ; i < strlen(a) ; i++) 
{ 
    printf("%d" , i); /******** LINE 24 ********/ 
    b[i] = a[i];   
} 
b[i] = '\0'; // Make sure b is properly terminated 
+1

另外他在每次迭代时都调用strlen,这在性能方面是不可取的。 –

+0

@Klas谢谢。 – Soosh

+0

@Michael不错的提示。 – Soosh

1
char * str = "aaaaaaaaaaaaaaaaaaaaaaaaa"; 
char* str2 = malloc(4*sizeof(str)); 

str是一个指针,它是尺寸(大概)32位 - >的4个字节。所以你分配的不是字符串的大小,但是一个字符串的大小四个指针需要(16个字节),你的字符串长度是26个字节(包括0字节)。

另外,当输出一个字符串时,您必须分配一个比字节长的字节,以解释指示字符串结尾的0字节。

char * str = "aaaaaaaaaaaaaaaaaaaaaaaaa"; 
char* str2 = malloc(strlen(str)+1); 

int i; 
for(i = 0 ; i < strlen(a) ; i++) 
{ 
    printf("%d" , i); /******** LINE 24 ********/ 
    b[i] = a[i];   
} 
b[i] = 0; // Terminate the string. 

如果不终止字符串,那么函数对字符串的工作(如strlenprintf等)将untl他们遇到的0字节它可以在你的存储器中的任何扫描串。因此,如果你的代码中的strlen有时似乎给出了正确的长度,如果这样的字节恰好在最后,但它会更经常地给出错误的结果(未定义的行为),这说明了你在你看到的奇怪字符输出。

+0

谢谢你的回答。 – Soosh