scanf("%d", &value);
然而,常见的书写错误如下:
scanf("%d", value);
这种情况下,scanf将把value内容解释为一个地址,并试图将一个字写到这个位置。这会导致程序出现异常,有时会立即终止;有时会在相当长的时间后造成灾难性、令人困惑的后果。
int *matvec(int **A, int *x, int n)
{
int i, j;
int *y = (int *)malloc(n * sizeof(int));
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
y[i] += A[i][j] * x[j]
}
}
return y;
}
void buff()
{
char buf[64];
gets(buf);
return;
}
int **makeArray(int n, int m)
{
int i;
int **A = (int **)malloc(n * sizeof(int)); /* 注意此处语句,存在问题 */
for(i = 0; i < n; i++)
{
A[j] = (int *)malloc(m * sizeof(int));
}
return A;
}
sizeof(int *)
写成了sizeof(int)
,代码实际上创建的是一个int的数组。int **makeArray(int n, int m)
{
int i;
int **A = (int **)malloc(n * sizeof(int)); /* 注意此处语句,存在问题 */
for(i = 0; i <= n; i++) /* 注意循环终止条件 */
{
A[j] = (int *)malloc(m * sizeof(int));
}
return A;
}
如果不太注意C操作符的优先级和结合性,我们就会错误地操作指针,而不是指针所指向的对象。如果想要减少某个指针指向的整数的值,代码书写如下:
*ptr--;
然而,因为一元运算符“--”和“*”的优先级相同,且从右向左结合。那么上述代码实际的效果为*(ptr--)
,即减少的是指针自己的值,而不是它所指向的整数的值。
(*ptr)--;
int *search(int *p, int val)
{
while(*p && *p != val)
{
p += sizeof(int);
}
return p;
}
int *stackref()
{
int val;
return &val;
}
这个函数返回一个指针(假设为ptr),指向栈里的一个局部变量,然后弹出它的栈帧。尽管ptr仍然指向一个合法的内存地址,但它已经不再指向一个合法的变量了。
int *heapref(int n, int m)
{
int i;
int *x, *y;
x = (int *)malloc(n * sizeof(int)); /* 申请内存 */
...
free(x); /* 释放内存 */
y = (int *)malloc(m * sizeof(int));
for(i = 0; i < m; i++)
{
y[i] = x[i]++;
}
return y;
}
当程序在第15行引用x[i]时,数组x可能已经是某个其他已分配堆块的一部分了,其内容也许被重写了。导致程序运行结果与预期不符合,出现错误。
void leak(int n)
{
int *x = (int *)malloc(n * sizeof(int));
return;
}
END
→点关注,不迷路←
文章引用微信公众号"嵌入式微处理器",如有侵权,请联系管理员删除!