1

私はおそらく何かを逃しましたが、ただ聞きたいです..私は本Advanced Linuxprogrammingでこのコードを見つけました:

    char* get_self_executable_directory ()
    {
      int rval;
      char link_target[1024];
      char* last_slash;
      size_t result_length;
      char* result;
      /* Read the target of the symbolic link /proc/self/exe. */
      rval = readlink (“/proc/self/exe”, link_target, sizeof (link_target));
      if (rval == -1)
        /* The call to readlink failed, so bail. */
        abort ();
      else
        /* NUL-terminate the target. */
        link_target[rval] = ‘\0’;
      /* We want to trim the name of the executable file, to obtain the
      directory that contains it. Find the rightmost slash. */
      last_slash = strrchr (link_target, ‘/’);
      if (last_slash == NULL || last_slash == link_target)
        /* Something strange is going on. */
        abort ();
      /* Allocate a buffer to hold the resulting path. */
      result_length = last_slash - link_target;
      result = (char*) xmalloc (result_length + 1);
      /* Copy the result. */
      strncpy (result, link_target, result_length);
      result[result_length] = ‘\0’;
      return result;
    }

そして私の質問は、この関数はダングリングポインタを返さないのですか?

4

2 に答える 2

8

ポインタを返し、割り当て解除がクライアントコードで行われることを期待します。ポインタを返す関数を見つけたら、メモリの所有権(つまり、割り当てを解除する責任)が関数のクライアントに渡されるかどうか、そして渡される場合はどの程度正確にすべきかを常に自問する必要があります(実際には作成者です...)。解放されます。

于 2012-07-21T19:30:55.870 に答える
5

いいえ-メモリを割り当てて返します。

于 2012-07-21T19:30:22.867 に答える