#include<stdio.h> int *pstract (int*,int*); int main(void) { int s1[5]={1,2,3,4,5}; int s2[3]={1,2,3}; int *w; w = pstract(s1,s2); printf("%s",s1); return 0; } int *pstract(int *s1,int *s2) { int n; int *q = s2; int *p = s1; n = sizeof(s1)/sizeof(int); p += n-1; while(*q != '\0') { *p = *q; p++; q++; } *++q='\0'; p = s1; return p; }
时间: 2023-08-08 22:07:20 浏览: 43
这段代码存在一些问题,可能会导致程序崩溃或者输出错误结果。
1. 在函数 pstract 中,使用 sizeof(s1)/sizeof(int) 来计算数组 s1 的元素个数是不正确的。因为在函数中传递的数组参数 s1 实际上是一个指针,sizeof(s1) 返回的是指针类型的字节数,而不是数组的总字节数。应该在调用函数时,同时传递数组的长度信息。
2. 在函数 pstract 中,往数组 s1 中添加元素时,没有判断 s1 的长度是否足够。这可能会导致数组越界访问,从而导致程序崩溃或者输出错误结果。
3. 在主函数中,使用 printf("%s",s1) 来输出数组 s1 的内容,这是错误的。因为数组 s1 中存储的是整数类型的数据,而不是字符串类型的数据。应该使用循环逐个输出数组中的元素。
下面是一种可能的修改方案:
```
#include <stdio.h>
int *pstract(int*, int*, int);
int main(void)
{
int s1[5] = {1, 2, 3, 4, 5};
int s2[3] = {1, 2, 3};
int *w;
w = pstract(s1, s2, 5);
for (int i = 0; i < 5; i++) {
printf("%d ", s1[i]);
}
printf("\n");
return 0;
}
int *pstract(int *s1, int *s2, int len)
{
int *q = s2;
int *p = s1 + len - 1;
while (*q != '\0' && p >= s1) {
*p-- = *q++;
}
return s1;
}
```
修改后的程序中,将数组长度作为参数传递给函数 pstract,避免了使用 sizeof 计算数组长度的问题。在函数 pstract 中,加入了对 s1 数组长度的判断,避免了数组越界访问的问题。在主函数中,使用循环逐个输出数组 s1 中的元素,避免了将整数数组误认为字符串数组的问题。