طباعة دليل العمل الحالي في لغة C باستخدام المؤشرات

StackOverflow https://stackoverflow.com//questions/9697056

  •  13-12-2019
  •  | 
  •  

سؤال

هدف :طباعة دليل العمل الحالي في C على جهاز Linux

بدون استخدام المؤشرات، فإنه يعطي الإخراج الصحيح..

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<errno.h>
int main()
{
    //char buf[1024];

    char * buf;
    char * cwd;
    buf = (char *)malloc(sizeof(char) * 1024);

    if((cwd = getcwd(buf, sizeof(buf))) != NULL)
            printf("pwd : %s\n", cwd);
    else
            perror("getcwd() error : ");
    return 0;
}

ولكن مع المؤشر يظهر الخطأ التالي

getcwd() error : : Numerical result out of range
هل كانت مفيدة؟

المحلول

هذا لأنه عندما buf هو المؤشر، sizeof(buf) هو عدد البايتات المطلوبة لتخزين أ المؤشر, ، وليس حجم المصفوفة، كما في الكود الذي قمت بالتعليق عليه.

تحتاج إلى تمرير الحجم الذي قمت بتخصيصه (أي.1024) بدلا من ذلك، مثل هذا:

size_t allocSize = sizeof(char) * 1024;
buf = (char *)malloc(allocSize);
if((cwd = getcwd(buf, allocSize)) != NULL) ...

نصائح أخرى

sizeof(buf) سوف يعود حجم char* والذي سيكون على الرغم من عدد البتات التي يبلغها معالجك (32 بت أو 64 بت).

ما تريده هو استخدام الرقم السحري الذي حددته، في هذه الحالة 1024.

جرب هذا:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>

int main()
{
    //char buf[1024];

    char * buf;
    char * cwd;
    buf = (char *)malloc(sizeof(char) * 1024);

    if((cwd = getcwd(buf, 1024)) != NULL)
            printf("pwd : %s\n", cwd);
    else
            perror("getcwd() error : ");
    return 0;
}

char *getcwd(char *buf, size_t size);
هنا أنت تعطي الحجم كما sizeof(buf) والتي سوف ترجع حجم buf المؤشر الذي سيعتمد على الآلة.
يجب عليك تحديد 1024 في الوسيطة getcwd.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top