0

我的代码不起作用。在我接受字符串时出现运行时错误。这段代码有什么问题?

//this is what i have in main()
char *ele,*s[max];
int *count,temp=0;
count=&temp;   
printf("Enter string to insert: ");
scanf("%s",ele);
addleft(s,ele,count);

//following is the function definition
void addleft(char *s[max],char *ele,int *count)
{
    int i;
    if((*count)==max)
    {
        printf("Queue full!\n");
        return;
    }
    for(i=*count;i>0;i--)
        strcpy(s[i],s[i-1]);
    strcpy(s[0],ele);
    (*count)++;
    printf("String inserted at left!\n");
}
4

3 回答 3

3

ele是一个未初始化的char*并且没有与之关联的内存,并且scanf()将尝试写入它导致未定义的行为,可能是分段错误。

您需要动态分配内存ele或声明本地数组,并在使用时防止缓冲区溢出scanf()

char ele[1024];
if (1 == scanf("%1023s", ele))
{
    /* Process 'ele'. */
}

此外,该函数addleft()正在使用strcpy()on s,它是一个数组,char*并且数组中的每一个都char*被统一化。这是未定义的行为和可能的分段错误。要更正,您可以strdup()在其他情况下使用malloc(),并且strcpy()

/* Instead of:
       strcpy(s[0],ele);
   use:
 */
s[0] = strdup(ele);

请注意,函数for内部的循环addleft()是危险的,因为其中char*包含s的长度不一定相同。这很容易导致超出数组末尾的写入。但是,由于元素是动态分配的地址,char*您可以只交换元素而不是复制它们的内容。

于 2012-10-09T16:32:26.230 回答
0

sscanf("%s", ele) 将输入放入 'ele' 指向的内存中。但是'ele'从未被初始化为指向任何东西。就像是:

char ele[128];

或者

char* ele = malloc(...)

应该修复它。

于 2012-10-09T16:34:24.480 回答
-1

您正在导致缓冲区溢出,因为指针ele未指向任何已分配的内存。您正在写入程序需要运行的内存,因此使其崩溃。我建议您malloc像这样在您的程序中实施:

char *ele;
if (!(ele = malloc(50))) //allocate 50 bytes of memory 
{
    //allocation failed
    exit(0);
}
scanf("%s", ele); //string can hold 50 bytes now
free(ele);        //free allocated space

您可能想在此处malloc阅读该功能

更简单的方法是创建ele一个数组而不是一个指针:

char ele[50]; //ele is an array of 50 bytes 
于 2012-10-09T16:37:44.597 回答