2017-02-25 148 views
-4

即时通讯初学者,我的英语不太好所以先抱歉。我写了一个函数,它获取一个字符串和一个数字,然后移动字符串'数字'步骤中的每个字母。我试图调试它,它停止工作。谁知道这个问题?char arr =“...”;在C程序导致崩溃

这里是我的代码:

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

void moveString(char* str, int _switch); 

void main() 
{ 
    char arr = "abcdef"; 
    moveString(arr, 2); 
    printf("%s", arr); 
} 

void moveString(char* str, int _switch) 
{ 
    int len = strlen(str) + 1, i = 0, j = 0, move = len - _switch + 1; 
    char* temp = (char*)malloc(sizeof(char)*len); 
    if (!temp) 
     return NULL; 
    for (i = 0;i < move;i++) 
     temp[i+_switch] = str[i]; 
    for (j = 0;j < _switch;j++) 
     temp[j] = str[len - _switch + j + 1]; 
    str = temp; 
} 

这里是错误:

Exception thrown at 0x0FCA1FD0 (ucrtbased char arr = ".dll) in ConsoleApplication3.exe: 0xC0000005: Access violation reading location 0x00000030."

+1

这甚至不应该编译。你在声明为返回void的函数中返回NULL。 – melpomene

+1

你正在写'temp [i + _switch]'。 'i'的值最多是'move - 1'。 'move'是'len - _switch + 1',所以'i'的最大值是'len - _switch'。因此'i + _switch'的最大值是'len'。 'temp'是'len'字节长,所以索引'len'超出范围(有效索引是'0'..' len-1')。 – melpomene

+1

'str'是'moveString'中的局部变量。 'str = temp'这个赋值是无用的,因为它是“死的”:这是'str'停止存在之前函数中的最后一个语句,所以没有人会看到赋值。 – melpomene

回答

1

你应该注意编译器警告并消除所有的人。他们的存在是有原因的。

当你编写你的代码时,你最有可能得到类似warning: initialization makes integer from pointer without a cast [-Wint-conversion] char arr = "abcdef";这是你的崩溃的原因。

应当char *arr = "abcdef",因为在"abcdef" C是指针abcdef被写入存储器的区域。

但这不是您的程序唯一的问题。真的,看看编译器的消息,并确保你了解什么是警告,并修复你的代码不产生任何。

+0

这是一堆意见与一般意见,但不是一个答案。 – Olaf

+0

@Olaf这就是答案。仔细读。如上所述,将'char arr'改为'char * arr'将消除崩溃。 – avysk

+0

谢谢@avysk! – Jovani